如何优化MYSQL查询?

oxcyiej7  于 2022-12-28  发布在  Mysql
关注(0)|答案(1)|浏览(166)

我想用一些settings_id获取表的最新记录。
| 身份证|设置_id|添加日期|
| - ------| - ------| - ------|
| 1个|七|2022年8月23日01时44分24秒|
| 第二章|九|2022年8月23日01时44分24秒|
| 三个|十一|2022年8月23日01时44分24秒|
| 四个|七|2022年8月25日01时44分24秒|
| 五个|九|2022年8月25日01时44分24秒|
| 六个|十一|2022年8月25日01时44分24秒|
| 七|七|2022年8月26日01时44分24秒|
| 八个|九|2022年8月26日01时44分24秒|
| 九|十一|2022年8月26日01时44分24秒|

SELECT id, settings_id, MAX(added_date) 
FROM data_rows 
WHERE settings_id IN (7,9,11) 
GROUP BY settings_id;

预期结果
| 身份证|设置_id|添加日期|
| - ------| - ------| - ------|
| 七|七|2022年8月26日01时44分24秒|
| 八个|九|2022年8月26日01时44分24秒|
| 九|十一|2022年8月26日01时44分24秒|

    • 我得到了想要的结果,但问题是获取数据需要一分钟以上的时间。**

是否有办法减少此查询所花费的时间
谢啦,谢啦

x8diyxa7

x8diyxa71#

在MySQL 8+上,使用ROW_NUMBER可以轻松满足您的要求:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY settings_id ORDER BY addedDate DESC) rn
    FROM data_rows 
    WHERE settings_id IN (7, 9, 11)
)

SELECT id, settings_id, addedDate
FROM cte
WHERE rn = 1
ORDER BY settings_id;

对于优化上述查询,(settings_id, dateAdded DESC)上的索引应该有所帮助:

CREATE INDEX idx ON data_rows (settings_id, dateAdded);

如果使用这个索引,MySQL应该能够快速计算出所需的行数。

    • 编辑:**

在MySQL 5.7上,使用以下查询:

SELECT d1.id, d1.settings_id, d1.addedDate
FROM data_rows d1
INNER JOIN
(
    SELECT settings_id, MAX(addedDate) AS maxAddedDate
    FROM data_rows
    WHERE settings_id IN (7, 9, 11)
    GROUP BY settings_id
) d2
    ON d2.settings_id = d1.settings_id AND
       d2.maxAddedDate = d1.addedDate
WHERE
    d1.settings_id IN (7, 9, 11)
ORDER BY
    d1.settings_id;

使用与上述建议相同的索引。

相关问题