Mysql

為什麼我們在 MySQL 索引中不能有多個不等式條件?

  • September 30, 2019

我最近正在研究 MySQL 中的數據庫索引。我讀了一些文章,發現了一個很棒的網頁:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql

我在這個頁面和其他一些頁面中讀到,我們可以只使用一個不等式條件來使用索引性能,我們應該將它用作複合索引中的最後一列。我不明白為什麼只有一個?限制我們在復合索引的列集中使用多個不等式約束的原因是什麼?

我研究的另一個有用的連結: https ://www.freecodecamp.org/news/database-indexing-at-a-glance-bb50809d48bd/

這不是 MySQL 特有的,它一般是關於 B-tree 索引的。

撇開實現細節不談,您可以將 B 樹索引想像為索引列的排序列表,並帶有指向表的指針。

因此,如果您想像 上的兩列索引(num1, num2),它看起來有點像這樣:

 num1  |  num2  | pointer
--------+--------+---------
     1 |      1 |
     1 |      3 |
     1 |     42 |
     1 |     42 |
     1 |  28643 |
     1 |  36001 |
     2 |      1 |
     2 |     41 |
     2 |   1001 |
     2 |  10000 |
     5 |      2 |
     5 |    123 |
     5 |   2054 |
...

現在**,如果您要查找的所有列在索引中彼此相鄰,則可以有效地使用索引**。(MySQL 稱之為鬆散索引掃描,可以不同地使用索引,但這不適用於手頭的討論。)

如果您的查詢包含

WHERE num1 = 2 AND num2 > 10

很明顯可以有效地使用索引:所有這些索引條目都彼此相鄰。

如果您的查詢包含

WHERE num1 <= 5 AND num2 > 1000

那麼索引可以用於第一個條件,因為所有這些行都彼此相鄰),但是在這些行中,帶有的那些num2 > 1000到處都是,所以第二個條件只能用作過濾器來刪除索引掃描找到的行。

引用自:https://dba.stackexchange.com/questions/249848