想象一下MySQL
表格,其中一個字段id
包含從1號到10億的10億行。使用模數時,索引是否會提高性能?
當我做這樣的
SELECT * FROM table WHERE id > 2000 AND id < 5000;
顯而易見的是,在id
指數將提高該查詢的查詢的性能。
但是沒有這樣的指標也有模幫助,如下面的查詢
SELECT * FROM table WHERE (id % 4) = 0;
是否使用模在使用索引幫助嗎?
想象一下MySQL
表格,其中一個字段id
包含從1號到10億的10億行。使用模數時,索引是否會提高性能?
當我做這樣的
SELECT * FROM table WHERE id > 2000 AND id < 5000;
顯而易見的是,在id
指數將提高該查詢的查詢的性能。
但是沒有這樣的指標也有模幫助,如下面的查詢
SELECT * FROM table WHERE (id % 4) = 0;
是否使用模在使用索引幫助嗎?
編號
索引中使用的列函數(幾乎)總是排除使用索引。即使這不是真的,優化器可能決定不使用索引。只提取四條記錄中的一條可能不夠有選擇性,因此索引值得。
在Oracle DB中,例如,您可以定義所謂的基於函數的索引用於您在索引中定義模數函數的目的。但我很確定基於函數的索引不存在於MySQL中。
你可以做什麼作爲一種解決方法是增加一個附加列您存儲您的模函數的結果。您必須修改插入腳本以填充它以供將來插入並更新現有數據集。然後你可以添加一個索引到該列並在你的where子句中使用它。
@Isaiah:你的意思是它會幫助最後一個例子嗎?我不確定我自己,但是我很難弄清楚像BTREE索引這樣的事情會如何去做,並且用模來做一些事情:只有實際的值被保存,對,所以沒有關於該模的「知識」:它將prolly需要表掃描。不完全確定。 – Nanne 2015-02-07 19:57:00
我認爲它仍然會對所有記錄進行表掃描。 – Teja 2015-02-07 19:59:32