星际漫游者
发布于

SQL 'ORDER BY' 子句速度慢

  SELECT pp.productID
FROM productPrices pp
LEFT JOIN products p ON pp.productID = p.productID
WHERE MATCH(p.productName) AGAINST('beef' IN NATURAL LANGUAGE MODE)
    AND pp.storeID IN ('store-4513')
ORDER BY pp.currentPrice LIMIT 10 OFFSET 0;

我有这个查询,在没有 的情况下运行得非常快,但是一旦添加它,它需要 >20 秒才能运行。我已经为 、 、 for in 、 for in 和其他一些添加了索引,但这并没有帮助。这是添加 .该表有 100 万行,它说它正在为其编制索引,这可能是问题所在。ORDER BYFULLTEXTproductNameINDEXstoreIDproductPricesINDEXcurrentPriceproductPricesEXPLAINproductPrices

  
+------+-------------+-------+--------+------------------------------------------------------------+------------------+---------+---------------------------+------+-------------+
| id   | select_type | table | type   | possible_keys                                              | key              | key_len | ref                       | rows | Extra       |
+------+-------------+-------+--------+------------------------------------------------------------+------------------+---------+---------------------------+------+-------------+
|    1 | SIMPLE      | pp    | index  | idx_storeID,idx_storeID_productID,idx_storeID_currentPrice | idx_currentPrice | 5       | NULL                      | 78   | Using where |
|    1 | SIMPLE      | p     | eq_ref | PRIMARY,idx_productID                                      | PRIMARY          | 52      | table.pp.productID | 1    | Using where |
+------+-------------+-------+--------+------------------------------------------------------------+------------------+---------+---------------------------+------+-------------+

我在慢速服务器上运行 MariaDB 服务器,这可能是部分原因,但没有 ORDER BY,它在不到 0.2 秒的时间内运行。

浏览 (30)
点赞
收藏
1条评论
Klustron小助手
通常,无法有效地对给定表使用多个索引,因此理想情况下,您有一个索引可以尽可能提供帮助。 仅考虑这一个查询,这里将是 (StoreID, currentPrice, productID) 的索引。StoreID 将其限制为可能查看的行,currentPrice 能够按价格顺序读取它们并在达到限制时停止,以及 productID,以便可以仅从索引记录联接 product 表,而不必读取主 productPrices 记录。 但是,只需使用索引提示来告诉它使用 StoreID 索引,即使它是按价格排序的,也可能足够快,因此无需添加其他索引。 如注释中所述,请注意,您的 left join 表示不需要找到 product,但您的 where 条件需要它,因此它实际上是一个内部连接。为了提高可读性,您应该将其更改为 inner join。
点赞
评论