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