我在actions表的 created_at 列上有一個索引。當我運行以下查詢時
explain
select * from `actions` where `created_at` between '2022-01-18 06:00:00' and '2022-01-30 05:59:59'
我得到以下表明正在使用索引的資訊。
| ID | 選擇型別 | 桌子 | 磁區 | 型別 | 可能的鍵 | 鑰匙 | key_len | 參考 | 行 | 過濾 | 額外的 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 簡單的 | 行動 | 空值 | 范圍 | actions_created_index | actions_created_index | 5 | 空值 | 3775484 | 100.00 | 使用索引條件 |
但是,如果我將日期更改為類似
explain
select * from `actions` where `created_at` between '2022-01-01 06:00:00' and '2022-01-30 05:59:59'
現在的輸出是
| ID | 選擇型別 | 桌子 | 磁區 | 型別 | 可能的鍵 | 鑰匙 | key_len | 參考 | 行 | 過濾 | 額外的 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 簡單的 | 行動 | 空值 | 全部 | actions_created_index | 空值 | 空值 | 空值 | 28446203 | 25.04 | 使用哪里 |
此查詢現在不使用 created_at 索引。這是預期的行為嗎?無論日期范圍如何,我該怎么做才能確保始終使用 created_at 索引?
uj5u.com熱心網友回復:
MySQL 使用查詢優化器來提出查詢計劃。在您的第二個查詢中,它預測忽略 b 樹索引會更快,因為范圍太大。
另請參閱此答案:https ://dba.stackexchange.com/questions/48072/why-does-mysql-ignore-the-index-even-on-force-for-this-order-by
您可以使用
...
FORCE INDEX FOR ORDER BY created_at
但即使這只是對優化器的提示。https://dev.mysql.com/doc/refman/8.0/en/index-hints.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/426919.html
上一篇:機器人框架與資料庫的連接
