【发布时间】:2011-08-12 02:16:40
【问题描述】:
我有以下 MySQL 查询,我希望 LIMIT 更快,因为它的运行速度非常慢。 SQL_CALC_FOUND_ROWS 大约等于 114000 行。
SELECT SQL_CALC_FOUND_ROWS PStD.ProductID FROM ProductStoreDef PStD
JOIN ProductSummary PS ON PStD.ProductID = PS.ProductID
JOIN MasterVendor MV ON MV.VendorID = PStD.MasterVendorID
WHERE
PStD.SKUStatus = 'A' AND
MV.isActive = 1 AND
PStD.MasterCategoryID = 66 AND
PStD.CustomerPrice > 0
ORDER BY PStD.VendorName, PS.VendorPartNumber
LIMIT 100000,50
以下是EXPLAIN结果
+----+-------------+-------+--------+-------------------------------------------------------------------------------------------------+-----------------+---------+-------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------------------------------------------------------------------------+-----------------+---------+-------------------------+------+----------------------------------------------+
| 1 | SIMPLE | MV | ALL | PRIMARY,isActive,VendorID | NULL | NULL | NULL | 2126 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | PStD | ref | PRIMARY,MasterVendorID,MasterCategoryID,SKUStatus,CustomerPrice,MasterVendCatID,ProdStoreStatus | MasterVendCatID | 8 | ecomm.MV.VendorID,const | 94 | Using where |
| 1 | SIMPLE | PS | eq_ref | PRIMARY | PRIMARY | 4 | ecomm.PStD.ProductID | 1 | |
+----+-------------+-------+--------+-------------------------------------------------------------------------------------------------+-----------------+---------+-------------------------+------+----------------------------------------------+
任何建议将不胜感激。
更新:通过创建一个单独的表格解决了这个问题,该表格预先计算了排序顺序,使网站的运行速度提高了大约 500 到 1000 倍。
【问题讨论】:
-
您在 ProductStoreDef.VendorName 和 ProductSummary.VendorPartNumber 列上有索引吗?
-
尽可能删除 SQL_CALC_FOUND_ROWS,它会大大减慢查询速度。并请显示 EXPLAIN 以供查询
-
使用或不使用 SQL_CALC_FOUND_ROWS 绝对没有区别。 EXPLAIN 看起来一样。
-
@wonk0 在这种情况下它不应该减慢查询速度,因为尽管 SQL_CALC_FOUND_ROWS 查询应该处理所有行。
标签: mysql database optimization limit