用子查询优化MySQL选择查询

用子查询优化MySQL选择查询,mysql,Mysql,嗨,可以优化下面的SELECT查询吗?查询本身正在工作,但当我们查询大数据时,我们会遇到一条php消息,该消息的最大执行时间超过了30秒。我将查询中的列减少到Topping3,但我将查询到Topping15列 项目表中的当前数据 这是预期的结果 -------------------------------------------------------------------------------------------------------- | itemID | itemName |

嗨,可以优化下面的SELECT查询吗?查询本身正在工作,但当我们查询大数据时,我们会遇到一条php消息,该消息的最大执行时间超过了30秒。我将查询中的列减少到Topping3,但我将查询到Topping15列

项目表中的当前数据

这是预期的结果

--------------------------------------------------------------------------------------------------------
| itemID | itemName | Description | Topping1 | Top1_desc | Topping2 | Top2_desc | Topping3 | Top3_desc |
--------------------------------------------------------------------------------------------------------
|    1   |   HAM1   |  Hamburger  |   ONI1   |   Onion   |   TOMO1  |  Tomato   |          |          |
--------------------------------------------------------------------------------------------------------
|    2   |   ONI1   |    Onion    |          |           |          |           |          |          |
--------------------------------------------------------------------------------------------------------
|    3   |   TOMO1  |   Tomato    |          |           |          |           |          |          |
--------------------------------------------------------------------------------------------------------

这应该很快,除非有许多条目具有相同的客户端ID。您可以在所有子查询之后添加限制1,即:从PLU=a.Topping1和ClientID=1679 LIMIT 1等项中选择不同的描述

然而,我怀疑这是一个索引问题。ClientID和PLU字段是否已编制索引

编辑:查询的备选方案:

SELECT 
    itemID,
    itemName,
    Topping1,
    t1.Description AS Top1_desc,
    Topping2,
    t2.Description AS Top2_desc,
    Topping3,
    t3.Description AS Top3_desc,
FROM
    items a
LEFT JOIN
    items t1 ON t1.PLU=a.Topping1 AND t1.ClientID = 1679
LEFT JOIN
    items t2 ON t2.PLU=a.Topping2 AND t2.ClientID = 1679
LEFT JOIN
    items t3 ON t3.PLU=a.Topping3 AND t3.ClientID = 1679
WHERE
    ...
GROUP BY
    a.itemID

字段itemID、PLU和ClientID需要索引。

Hi,是的,ClientID和PLU都需要索引。我们将尝试将限制1添加到子查询中。由于我觉得限制没有帮助,我添加了一种额外的方法来编写您的查询。连接通常比子查询快。
--------------------------------------------------------------------------------------------------------
| itemID | itemName | Description | Topping1 | Top1_desc | Topping2 | Top2_desc | Topping3 | Top3_desc |
--------------------------------------------------------------------------------------------------------
|    1   |   HAM1   |  Hamburger  |   ONI1   |   Onion   |   TOMO1  |  Tomato   |          |          |
--------------------------------------------------------------------------------------------------------
|    2   |   ONI1   |    Onion    |          |           |          |           |          |          |
--------------------------------------------------------------------------------------------------------
|    3   |   TOMO1  |   Tomato    |          |           |          |           |          |          |
--------------------------------------------------------------------------------------------------------
SELECT 
    itemID,
    itemName,
    Topping1,
    t1.Description AS Top1_desc,
    Topping2,
    t2.Description AS Top2_desc,
    Topping3,
    t3.Description AS Top3_desc,
FROM
    items a
LEFT JOIN
    items t1 ON t1.PLU=a.Topping1 AND t1.ClientID = 1679
LEFT JOIN
    items t2 ON t2.PLU=a.Topping2 AND t2.ClientID = 1679
LEFT JOIN
    items t3 ON t3.PLU=a.Topping3 AND t3.ClientID = 1679
WHERE
    ...
GROUP BY
    a.itemID