簡體   English   中英

MySQL SELECT IN()語句和InnoDB索引失敗

[英]MySQL SELECT IN() statement and InnoDB Index fails

我有一個查詢,它執行此操作:

SELECT `threaded_comments`.* FROM `threaded_comments` WHERE `threaded_comments`.`parent_id` IN (4, 5)

我還在parent_id列上設置了一個INDEX。

當我對查詢執行EXPLAIN SELECT檢查時,我得到以下信息:

`select_type`,`table`,`type`,`possible_keys`,`key`,`key_len`,`ref`,`rows`,`Extra`
'SIMPLE', 'threaded_comments', 'ALL', 'COMMENT_PARENT', NULL, NULL, NULL, 3, 'Using where'

看起來沒有鍵被用於索引的where子句。 但是,當我做一個簡單的parent_id = 4然后它可以工作。 但是當我執行parent_id = 4或parent_id = 5時,它會顯示相同的消息。

我發現它與innoDB數據庫表類型有關系。 當在該特定數據庫引擎上執行IN操作時,MySQL似乎不喜歡它。 這可能是EXPLAIN工具的一個問題,還是缺少InnoDB的東西?

不,它與InnoDB無關。 您的EXPLAIN計划顯示查詢能夠使用索引,但MySQL優化器決定不使用它。 所選擇的決定取決於許多因素。 但是后來當你的桌子長大時,優化器可以做出不同的決定,如果它認為它是有用的。 如果要在該查詢上顯式使用索引,則可以嘗試強制索引

您似乎表中的行數太少而且完全掃描更可取。

指數並不總是有益的。

文檔

查詢每個表索引,並使用最佳索引,除非優化程序認為使用表掃描更有效。 有一次,根據最佳索引是否跨越超過表的30%使用掃描,但固定百分比不再決定使用索引或掃描之間的選擇。 優化器現在更復雜,並且基於其他因素(例如表大小,行數和I / O塊大小)進行估算。

在您的情況下,對於parent_id = 4 ,索引被認為是正常的,但對於parent_id IN (4, 5)首選表掃描

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM