[英]MySQL Index sometimes not being used
我有一個包含15萬行數據的表,並且有一個帶有UNIQUE INDEX
列,它的類型為VARCHAR(10)
並存儲10位數字的帳號。
現在,每當我查詢時,就像一個簡單的查詢:
SELECT * FROM table WHERE account_number LIKE '0103%'
結果為30,000+行,並且當我對查詢運行EXPLAIN時,表明未使用INDEX。
但是當我這樣做時:
SELECT * FROM table WHERE account_number LIKE '0104%'
使用INDEX的結果是4,000+行。
有人可以解釋嗎?
I'm using MySQL 5.7 Percona XtraDB.
30k + / 150k> 20%,我想做表掃描會更快。 從8.2.1.19開始,避免全表掃描 :
當MySQL使用全表掃描來解析查詢時,EXPLAIN的輸出在type列中顯示ALL 。 這通常在以下情況下發生:
您正在通過另一列使用基數較低的鍵(許多行與鍵值匹配)。 在這種情況下,MySQL假定通過使用鍵,它可能會執行許多鍵查找,並且表掃描會更快。
如果不需要所有值,請嘗試使用:
SELECT account_number FROM table WHERE account_number LIKE '0103%'
而不是SELECT *
。 然后,您的索引將變為覆蓋索引,並且優化程序應始終使用它(只要WHERE條件為SARGable)。
lad2025是正確的。 數據庫正在嘗試進行智能優化。
基准測試:
SELECT * FROM table FORCE INDEX(table_index) WHERE account_number LIKE '0103%'
看看誰更聰明:-)您可以隨時嘗試詢問優化器。 這就是索引提示的用途...
https://dev.mysql.com/doc/refman/5.7/zh-CN/index-hints.html
大多數數據庫使用B樹進行索引。 在這種情況下,數據庫優化器不使用索引,因為它在沒有索引的情況下掃描速度更快。 就像@ lad2025解釋的那樣。
您的數據庫列是唯一的,我認為您的索引基數很高。 但是,由於您的查詢使用了類似過濾器,因此數據庫優化器會決定不選擇使用索引。
您可以使用try force index來查看結果。 您使用具有唯一索引的varchar。 我會選擇其他數據類型或更改您的索引類型。 如果表僅包含數字,請將其更改為數字。 這將有助於優化您的查詢。
在某些情況下,您必須使用全文索引。
如果您需要有關優化查詢和表的幫助。 向我們提供更多信息以及您想從表中獲取哪些信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.