2013-06-20 172 views
0

我有一個60布爾(TINYINT(1))可搜索列的表。用戶可以使用給定列的任何子集作爲搜索條件。基於此,我無法爲我的需求創建一個好的索引。我在想,如果我可以創造型BIT的另一列(concat_col)(60),這將是可檢索列的串聯,即如何通過多個可搜索列有效搜索MySQL DB?

Table_A: 
id |col1|col2|...|col60|concat_col 
9999 | 1 | 0 |...| 1 |10...1 

然後我可以爲它創建一個良好的指數(上concat_col),但有是一個問題 - 我如何爲它創建一個查詢?

請參閱這個例子寫的僞代碼:

標準版本(這顯然做工精細):

SQL = SELECT * FROM Table_A WHERE col1=1 AND col60=1 

我的版本(「*」是通配符,因爲它不是「1」既非'0'):

SQL = SELECT * FROM Table_a WHERE concat_col = '1*...1'  

有沒有可能有效地解決這個問題?非常感謝您的幫助!

+0

我給你出個主意,因爲你是一個很好的方式自己。你有60列。第一列是2的冪0。第二是2的冪的1。第三是2的3的冪等等,直到你達到60.因此,你可以用單個數字來描述列的任意組合。 –

+0

@ N.B。感謝您的幫助。但是,我認爲我無法實現我真正需要的東西。實際上,我將能夠用一個數字來描述任何列的組合,但是我需要忽略除了我感興趣的列以外的所有列(本例中爲col1和col60)。所有其他列的值並不重要。你的想法可行嗎? –

+0

是的,這是可行的:)想象一下,如果你只想檢查第1列和第3列。描述該組合的數字是十進制5.第一列= 1(2 pow 0 = 1),第二列被跳過(0),第三列爲2 pow 2 = 4. 4 + 1 = 5. –

回答

0

嘗試:

SQL = SELECT * FROM Table_a WHERE concat_col REGEXP '^1[0-9a-zA-Z]{58}1$' 
+0

謝謝,我會的。它會有效並使用索引?這是我最關心的問題。 –

+0

是的,如果你添加索引,這會消耗更多的時間,這會消耗一些空間和內存在discard/ram – mirkobrankovic

+0

不,它不會。指數會有可怕的基數。每次都會執行全表掃描。 –