2010-08-24 143 views
4

我的MySQL表中有一個BIT類型的字段。我想存儲使用位值的記錄的狀態,例如:當使用按位函數查詢BIT字段時,MySQL不使用索引

1 = status1 
2 = status2 
4 = status3 
8 = status4 

每個記錄可以同時有很多狀態。對於STATUS1和STATUS3的值將是1 + 4 = 5我可以查詢表用於使用與STATUS3所有記錄:

SELECT * 
    FROM `table` 
WHERE `statuses` & 4 

我有索引上statuses,但EXPLAIN告訴沒有索引被使用。我可以在這種情況下使用索引嗎?

P.S.使用單獨的多對多鏈接表是更規範化的解決方案,但我想爲此有更多的「扁平」結構。

+0

索引的存在並不意味着優化器會選擇使用它。 – 2010-08-24 19:59:52

+2

你可能會發現這個線程很有用:[MySQL Forums :: Performance ::是可能的按位比較的索引掃描](http://forums.mysql.com/read.php?24,35318,35318#msg-35318) – Mike 2010-08-24 20:03:27

+0

我會在表格中看到很多值,我需要確保表格增長時不會有問題,任何提示如何檢查? – artvolk 2010-08-24 20:05:44

回答

3

優化器很難在位域上使用索引。考慮所有具有位2(值爲「4」)的不同值:4,5,6,7,12,13,14,15,20,21,22,23 ......優化器如何有效地那使用?

+1

是的,我明白,但可能有任何解決方法? – artvolk 2010-08-24 20:42:26

+0

不是我已經能夠弄清楚了,最通用的解決方案是將位分成不同的字段,如果不能在原始表中完成,那麼創建一個只包含分割位字段的新表肯定會有所幫助。 – wallyk 2010-08-25 14:41:54