簡體   English   中英

有時不使用MySQL索引

[英]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.

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