Mysql 请求执行时间过长
我正在寻找一些建议或优化。 表定义:Mysql 请求执行时间过长,mysql,sql,optimization,Mysql,Sql,Optimization,我正在寻找一些建议或优化。 表定义: CREATE TABLE IF NOT EXISTS MilestonesAndFlags( id SERIAL, site_id BIGINT, milestone BIGINT, value BIGINT, TIMESTAMP BIGINT, timestamp_confirmation BIGINT, COMMENT TEXT, INDEX(site_id), INDEX(mile
CREATE TABLE IF NOT EXISTS MilestonesAndFlags(
id SERIAL,
site_id BIGINT,
milestone BIGINT,
value BIGINT,
TIMESTAMP BIGINT,
timestamp_confirmation BIGINT,
COMMENT TEXT,
INDEX(site_id),
INDEX(milestone),
INDEX(milestone,site_id)
);
在这个表中,我存储了每个不同站点的不同里程碑和时间戳(以便能够对任何更改进行历史查看)。当时,表中有大约一百万行
当我尝试使用以下查询获取每个站点的最新实际里程碑值时,就会出现问题
SELECT site_id,
value
FROM SitesMilestonesAndFlags
WHERE id IN
(SELECT max(id)
FROM SitesMilestonesAndFlags
WHERE milestone=1
GROUP BY milestone,
site_id);
在我的电脑上,此请求执行时间比5分钟长。。
EXPLAIN
似乎还可以:
+----+--------------------+--------------------+------+-----------------------+-------------+---------+-------+--------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+--------------------+------+-----------------------+-------------+---------+-------+--------+--------------------------+
| 1 | PRIMARY | MilestonesAndFlags | ALL | NULL | NULL | NULL | NULL | 1111320| Using where |
| 2 | DEPENDENT SUBQUERY | MilestonesAndFlags | ref | milestone,milestone_2 | milestone_2 | 9 | const | 180660| Using where; Using index |
+----+--------------------+--------------------+------+-----------------------+-------------+---------+-------+--------+--------------------------+
关于更正确的查询或表结构有什么建议吗?
MySQL>=5.5我将试一试,建议您使用
临时别名表
,而不是作为依赖子查询的where语句。不确定mysql是否对主/外部查询的每一行进行了优化或运行了子查询
如果您在大数据量上运行查询并返回结果,这将非常有趣
例子:
SQLFiddle:
利与弊:
Pro:
避免依赖子查询
缺点:
- 连接导致投影和选择。这会导致临时表的所有行与原始表的行“相乘”,然后where条件过滤李>
更新
我还怀疑mysql版本在优化过程中起着重要作用。
下面解释两个不同mysql版本的结果,其中一个版本将子查询定义为依赖,另一个版本将子查询定义为非依赖
MySQL 5.5.32
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS EXTRA
1 PRIMARY MilestonesAndFlags ALL (null) (null) (null) (null) 29 Using where; Using filesort
2 DEPENDENT SUBQUERY MilestonesAndFlags ref milestone,milestone_2 milestone_2 9 const 15 Using where; Using index
MySQL 5.6.6 m9
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS EXTRA
1 PRIMARY MilestonesAndFlags ALL (null) (null) (null) (null) 29 Using where; Using filesort
2 SUBQUERY MilestonesAndFlags ref milestone,milestone_2 milestone_2 9 const 15 Using where; Using index
也在id
列上创建一个主索引。此外,这似乎是postgresql而不是mysql。@user3797030请尝试将mysql更新到更高版本>5.6,然后再次运行。我认为原始查询可能最快,因为优化检测到子查询不依赖(因此只运行一次)。
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS EXTRA
1 PRIMARY MilestonesAndFlags ALL (null) (null) (null) (null) 29 Using where; Using filesort
2 SUBQUERY MilestonesAndFlags ref milestone,milestone_2 milestone_2 9 const 15 Using where; Using index