gpt4 book ai didi

没有明确的 "USE INDEX"MySQL 查询非常慢

转载 作者:行者123 更新时间:2023-11-29 02:36:04 25 4
gpt4 key购买 nike

我遇到了一个奇怪的情况,我的 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 秒)的“解释”结果:

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 b range PRIMARY, time_stamp time_stamp 8 479 Using where; Using index
1 SIMPLE i ref ind_tableb_id,int_tablea_id ind_tableb_id 4 b._id 11
1 SIMPLE a eq_ref PRIMARY,level_id,project_id PRIMARY 4 i.table_a_id 1 Using where
1 SIMPLE l eq_ref PRIMARY PRIMARY 4 a.level_id 1 Using index

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

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 a ref PRIMARY,level_id,project_id project_id 4 const 2722
1 SIMPLE l eq_ref PRIMARY PRIMARY 4 a.level_id 1 Using index
1 SIMPLE i ref ind_tableb_id,int_tablea_id int_tablea_id 4 a._id 2
1 SIMPLE b eq_ref PRIMARY,time_stamp PRIMARY 4 i.table_b_id 1 Using where

如果我在其中放置一个明确的“USE INDEX”语句,那么我将 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 需要我告诉它使用哪个索引有什么想法吗?

最佳答案

您尝试过更新统计信息吗?

再次发布它作为答案:)

关于没有明确的 "USE INDEX"MySQL 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com