Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 你需要这个覆盖索引,而不是我上面推荐的索引:INDEXsaleDate、StoreNumber、departmentNumber、unitsSold、id_Mysql_Database_Performance_Optimization_Greatest N Per Group - Fatal编程技术网

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)