簡體   English   中英

MySQL索引| 與LIKE一起使用

[英]MySQL Indexing | Using it with LIKE

我有一張桌子說“ abcd”

內容如下

ID | email       | 

24 | abcd@g.com  | 
23 | asdsa@gm.com|
32 |asd@ggm.com  |

現在,我已經在(ID,email)上創建了索引

當我執行查詢時,EXPLAIN SELECT * FROM abcd WHERE ID = '23'; 我可以看到索引正在被使用。

但是,當我將查詢更改為EXPLAIN SELECT * FROM abcd WHERE ID LIKE'2%';

該索引不再使用

為什么會這樣呢? 兩種情況下都不應該使用索引嗎?

謝謝

MySQL使用基於成本的優化器 它將評估使用索引的成本與不使用索引的成本。

  • 如果您的表只有三行,那么是否使用索引幾乎沒有什么區別,因此MySQL可以選擇其中一種方案。
  • 錯誤的統計信息可能會導致本不應使用索引。
  • 如果您的表中有多於兩列且只有幾行,那么不使用索引可能會更便宜,因為因為無論如何都必須掃描所有行(對於int類型的列,LIKE沒有優化)。 在執行完全掃描並使用SELECT *時,使用索引幾乎沒有好處(順便說一句,這是一種不好的做法)。

話雖如此,我無法復制您的結果。 當我嘗試查詢時,MySQL始終使用索引。

在線查看: sqlfiddle

如果您的ID是整數類型,則其索引將無法像字符串索引那樣工作:它不會在內部使用小數位數,而是使用固定長度的二進制表示形式

考慮一下:“ 2%”必須與以下數字匹配:

2
20
200
2000
...

但是,對於MySQL引擎,將“ 2%”與這些表示形式進行匹配並不是一件容易的事:

0x0002
0x0014
0x00C8
0x07D0
0x4E20
...

從理論上講,它可以在內部將“ 2%”模式轉換為以下內容:

   ID BETWEEN   20 AND   29
OR ID BETWEEN  200 AND  299
OR ID BETWEEN 2000 AND 2999

我認為它極不可能。

暫無
暫無

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

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