Mysql
為什麼我們在 MySQL 索引中不能有多個不等式條件?
我最近正在研究 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
到處都是,所以第二個條件只能用作過濾器來刪除索引掃描找到的行。