我有以下查詢:mysql命令由品牌查詢慢解決了,但是不知道爲什麼
select *
from
`twitter_posts`
where
`main_handle_id` in (
select
`twitter`.`main_handle_id`
from
`users`
inner join `twitter` on `twitter`.`user_id` = `user`.`id`
where
`users` LIKE 'foo'
)
order by created_at
當使用順序由該查詢運行顯着變慢。 twitter_posts
表的索引位於created_at
時間戳和main_handle_id
列。
我用「解釋」來看引擎正在計劃做什麼,並注意到一個文件夾......我不期望看到這個文件夾作爲索引存在於twitter_posts
表中。在瀏覽覆蓋Stackoverflow和博客上的各種帖子後,沒有任何示例適用於我。我有一種預感,也許,sql優化器與嵌套選擇有些混淆。所以我包裹查詢,並通過created_at
下令的結果:
select * (select *
from
`twitter_posts`
where
`main_handle_id` in (
select
`twitter`.`main_handle_id`
from
`users`
inner join `twitter` on `twitter`.`user_id` = `user`.`id`
where
`users` LIKE 'foo'
)
)
order by created_at
使用這一個解釋,是否使用索引進行排序,並返回在它與文件排序需要一小部分的響應。所以我「解決了」我的問題,但我不明白爲什麼SQL會根據解決方案做出不同的選擇。據我所知,我只是包裝的結果,並要求一切看起來多餘的聲明...
編輯:我仍然不知道爲什麼優化器開始使用created_at上的索引當使用冗餘子查詢時,但在某些情況下不會更快。我現在用解決方案來添加語句「FORCE INDEX FOR ORDER BY created_at_index_name」。
您是否嘗試過使用強制索引? –
我有,但是這也不起作用+這是一個骯髒的解決方案...雖然冗餘查詢也是如此:)所以我的問題不是如何優化這個解決方案。我的問題是爲什麼。我認爲答案很可能取決於我使用的MariaDB版本。我不知道MySQL和Maria之間有任何顯着的優化變化... –
@PraveenE我已經更新了我的答案,使用冗餘選擇會導致在某些查詢中創建臨時表(取決於內部的位置聲明)也使其緩慢。 –