Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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_Performance_Optimization - Fatal编程技术网

MySQL查询速度非常慢,没有显式的;使用索引“;

MySQL查询速度非常慢,没有显式的;使用索引“;,mysql,performance,optimization,Mysql,Performance,Optimization,我遇到了一个奇怪的情况,我的MySQL查询要花很长时间。我通过添加一个显式的“USE INDEX”语句来修复它。我的问题是,为什么这是必要的——是什么导致MySQL优化程序出现如此严重的错误 下面是SQL语句: SELECT i._id FROM interim_table i JOIN tablea a ON i.table_a_id = a._id JOIN tableb b ON i.table_b_id = b._id JOIN levels l ON a.level_id = l._i

我遇到了一个奇怪的情况,我的MySQL查询要花很长时间。我通过添加一个显式的“USE INDEX”语句来修复它。我的问题是,为什么这是必要的——是什么导致MySQL优化程序出现如此严重的错误

下面是SQL语句:

SELECT i._id
FROM interim_table i
JOIN tablea a ON i.table_a_id = a._id
JOIN tableb b ON i.table_b_id = b._id
JOIN levels l ON a.level_id = l._id
JOIN projects p ON a.project_id = p._id
WHERE s.time_stamp > NOW() - INTERVAL 5 DAY AND a.project_id = 13
注意WHERE子句中的时间戳。如果设置为5天,则查询大约需要两秒钟。但是,如果我将它改为6天,MySQL超时的时间就会很长

这是使用“5天”间隔(需要2秒)的“解释”结果:

这是使用“6天”间隔(超时)的“解释”结果:

如果我把一个显式的“useindex”语句放在那里,那么我得到的6天间隔也降到了2秒

SELECT i._id
FROM interim_table i
JOIN tablea a ON i.table_a_id = a._id
JOIN tableb b USE INDEX (time_stamp) ON i.table_b_id = b._id
JOIN levels l ON a.level_id = l._id
JOIN projects p ON a.project_id = p._id
WHERE s.time_stamp > NOW() - INTERVAL 6 DAY AND a.project_id = 13
然后解释结果变成:

id   select_type  table  type     possible_keys                  key             key_len  ref            rows    Extra
1    SIMPLE       p      const    PRIMARY                        PRIMARY         4        const          1       Using index
1    SIMPLE       s      range    time_stamp                     time_stamp      8                       504     Using where; Using index
1    SIMPLE       i      ref      ind_tableb_id,ind_tableaid     ind_tableb_id   4        s._id          11                            
1    SIMPLE       v      eq_ref   PRIMARY,level_id,project_id    PRIMARY         4        i.table_a_id   1       Using where
1    SIMPLE       l      eq_ref   PRIMARY                        PRIMARY         4        v.level_id     1       Using index

有没有想过为什么MySQL需要我告诉它使用哪个索引?

你有没有尝试过更新统计数据


再次发布它作为回答:)

您是否尝试更新统计数据?正如@maximdim所说的,确保统计数据是最新的,在该表上运行
优化表
。查询计划器会对每个计划需要查看的行数进行一些猜测,有时会决定,如果需要扫描几乎整个表才能生成结果集,它应该跳过使用索引来查找行,而只是在读取整个表以生成结果时查找行。啊,这是固定的。我以为我今天早些时候就这么做了,但我一定错过了一张重要的桌子!如果你把这个贴出来作为答案,那么我会把它标记为答案。
SELECT i._id
FROM interim_table i
JOIN tablea a ON i.table_a_id = a._id
JOIN tableb b USE INDEX (time_stamp) ON i.table_b_id = b._id
JOIN levels l ON a.level_id = l._id
JOIN projects p ON a.project_id = p._id
WHERE s.time_stamp > NOW() - INTERVAL 6 DAY AND a.project_id = 13
id   select_type  table  type     possible_keys                  key             key_len  ref            rows    Extra
1    SIMPLE       p      const    PRIMARY                        PRIMARY         4        const          1       Using index
1    SIMPLE       s      range    time_stamp                     time_stamp      8                       504     Using where; Using index
1    SIMPLE       i      ref      ind_tableb_id,ind_tableaid     ind_tableb_id   4        s._id          11                            
1    SIMPLE       v      eq_ref   PRIMARY,level_id,project_id    PRIMARY         4        i.table_a_id   1       Using where
1    SIMPLE       l      eq_ref   PRIMARY                        PRIMARY         4        v.level_id     1       Using index