Mysql 你需要这个覆盖索引,而不是我上面推荐的索引:INDEXsaleDate、StoreNumber、departmentNumber、unitsSold、id
问:这看起来像一个子查询;整个查询是否类似于Mysql 你需要这个覆盖索引,而不是我上面推荐的索引:INDEXsaleDate、StoreNumber、departmentNumber、unitsSold、id,mysql,database,performance,optimization,greatest-n-per-group,Mysql,Database,Performance,Optimization,Greatest N Per Group,问:这看起来像一个子查询;整个查询是否类似于 SELECT * FROM ( that union mess ) AS u ORDER BY unitsSold DESC LIMIT 30 如果是这样的话,那就成了改变现状的最佳时机 SELECT m.* FROM ( that union mess, but with only `id` ) AS u JOIN movement AS m USING (id) ORDE
SELECT *
FROM ( that union mess ) AS u
ORDER BY unitsSold DESC
LIMIT 30
如果是这样的话,那就成了改变现状的最佳时机
SELECT m.*
FROM ( that union mess, but with only `id` ) AS u
JOIN movement AS m USING (id)
ORDER BY m.unitsSold DESC
LIMIT 30
但是,更好的办法是尽早完成限制:
这个版本只需要获取30整行,而不是像前一个例子那样获取278*30
一旦您仔细研究了我的建议,请回到IN的使用,看看它是否足够有效:
SELECT m.*
FROM ( SELECT id
FROM movement
WHERE saleDate = CURDATE() - INTERVAL WEEKDAY(curdate()) DAY
AND StoreNumber IN (...)
AND departmentNumber IN (...)
order by unitsSold desc
limit 30 )
JOIN movement AS m USING (id)
ORDER BY unitsSold DESC
由于很难预测哪个索引是最好的,我建议优化器选择多个覆盖索引:
INDEX(saleDate, StoreNumber, departmentNumber, unitsSold, id)
INDEX(saleDate, unitsSold, departmentNumber, StoreNumber, id)
saleDate是第一个,因为它是唯一的=。id是最后一个,因为它不涉及WHERE或ORDER BY,而只是“覆盖”。请参见解释中的使用索引
如果你有一个变量涉及一个日期范围而不是一个单一的销售日期,那么我所说的所有内容都需要修改以优化它。有些原则会继续存在,但索引不会。正确的索引将我的查询缩短到40秒。我可能会进一步优化,但仅仅是索引就可以管理它。我将花更多的时间考虑你的其他建议,尽管我不知道它们是否完全合适。Jasper reports要求在查询中进行排序,以便正确显示,这就是为什么查询如此重复的原因。谢谢你的帮助。哎呀,我的前两个查询缺少一个必要的订单。
SELECT m.*
FROM ( that union mess, but with only `id` ) AS u
JOIN movement AS m USING (id)
ORDER BY m.unitsSold DESC
LIMIT 30
SELECT m.*
FROM ( SELECT id
FROM ( that union mess, but with only `id` ) AS u
ORDER BY unitsSold DESC
LIMIT 30 )
JOIN movement AS m USING (id)
ORDER BY unitsSold DESC
SELECT m.*
FROM ( SELECT id
FROM movement
WHERE saleDate = CURDATE() - INTERVAL WEEKDAY(curdate()) DAY
AND StoreNumber IN (...)
AND departmentNumber IN (...)
order by unitsSold desc
limit 30 )
JOIN movement AS m USING (id)
ORDER BY unitsSold DESC
INDEX(saleDate, StoreNumber, departmentNumber, unitsSold, id)
INDEX(saleDate, unitsSold, departmentNumber, StoreNumber, id)