Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 请求执行时间过长_Mysql_Sql_Optimization - Fatal编程技术网

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