mysql - 需要一个sql高效查询

标签 mysql indexing query-optimization sql-execution-plan groupwise-maximum

我的表中有大约 600 万行,我正在使用以下查询查询表。

SELECT * FROM FD_CPC_HISTORICAL_DATA WHERE id IN (SELECT MAX(id) FROM FD_CPC_HISTORICAL_DATA WHERE fb_ads_account_id=1462257067274960 AND created_at BETWEEN '2019-12-13 00:00:00' AND '2019-12-13 23:59:59' GROUP BY source_text) \G

我已经为 fb_ads_account_id、created_at、source_text 创建了索引。 id 是主键。

我的问题是,即使我已经创建了索引,为什么这个查询需要大约 9 秒才能得到结果?

有没有其他方法可以更高效地创建此查询?

这里是mysql explain命令解释

enter image description here

最佳答案

这是您的查询:

SELECT hd.*
FROM FD_CPC_HISTORICAL_DATA hd
WHERE hd.id IN (SELECT MAX(hd2.id)
                FROM FD_CPC_HISTORICAL_DATA hd2
                WHERE hd2.fb_ads_account_id = 1462257067274960 AND
                      hd2.created_at >= '2019-12-13' AND 
                      hd2.created_at < '2019-12-14'
                GROUP BY source_text
               );

我建议这样写:

SELECT hd.*
FROM FD_CPC_HISTORICAL_DATA hd
WHERE hd.fb_ads_account_id = 1462257067274960 AND
      hd.id = (SELECT MAX(hd2.id)
               FROM FD_CPC_HISTORICAL_DATA hd2
               WHERE hd2.fb_ads_account_id = hd.hd.fb_ads_account_id AND
                     hd2.source_text = hd.source_tx AND
                     hd2.created_at >= '2019-12-13' AND 
                     hd2.created_at < '2019-12-14'
               );

对于此查询,您需要在 FD_CPC_HISTORICAL_DATA(fb_ads_account_id, source_text,created_at) 上建立索引。

关于mysql - 需要一个sql高效查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345852/

相关文章:

MySql TABLE 数据类型

mysql - 从 SQL 导入数据时时间格式发生变化

mysql - 如何选择一系列行但将其从特定 ID 偏移

mysql - 如何在 MySQL 中进行递归 SELECT 查询?

php - MYSQL 同时比较时间和星期几

java - Lucene中找不到文档

MySQL 索引 - 可选的搜索条件

arrays - 在工作表中搜索相似行以组合在一起 Excel VBA

对于单行结果集,MySQL 查询停留在 "Sorting Result"

mysql - 优化Mysql查询Left Join