2016-07-27 51 views
2

這是InnoDB與MySQL 5.7的。MySQL - 索引字符串比較

如果我有這樣的查詢:

SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0 

是否有可能具有可以通過查詢使用上D的指數?即MySQL是否足夠聰明,可以爲STRCMP函數使用btree索引?

如果不是,我怎麼能夠重新設計查詢(和/或表),以便我可以對D進行字符串比較,並且可以有某種形式的修剪,以便它不必擊中每一個行?

+0

用途:WHERE D like%somestring% – kollein

+0

@kollein:對不起,但是這個評論又是如何相關?首先,由於前綴變量,%somestring%會關閉索引。其次,我試圖做字符串比較,而不是子字符串匹配。 –

回答

3

驚奇的是許多錯誤的答案爲止。讓我看看我不能加入他們。

STRCMP根據參數比較的方式返回-1,0或1。

STRCMP(D, 'somestring') > 0D > 'somestring'完全相同。 (不>=,不=,不LIKE

實際上,有可能覈對的差異,但是這可以根據需要被處理。

任何函數和某些操作符都可以使用INDEXes來「隱藏」列。 D > 'somestring'可受益於從D開始的索引; STRCMP版本不能。

+0

謝謝@ rick-james! (還可以使用@ydoow和@ mike-bryant)。這可能聽起來很愚蠢,但我不知道「>」等可以用在字符串操作數上! –

0

Mysql不會使用索引進行函數調用。

使用下面的查詢和報告d

SELECT A, B, C FROM TABLE WHERE D ='somestring' 

創建索引使用下面的查詢

create index index1 on TABLE(D); 
2

爲什麼不

WHERE D > 'somestring' 

這將充分利用創建索引典型B樹索引列D

1

如果僅通過將列值傳遞給諸如STRCMP()之類的函數來執行比較,那麼在對其進行索引時沒有值。

參考:https://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

A B樹索引可以在使用=>>=<<=,或BETWEEN運算符的表達式被用於列的比較。

所以,你可以使用

SELECT A, B, C FROM TABLE WHERE D > 'somestring'

代替,而LIKE更爲嚴格,可能是你所期望的。

此外,您可以使用COLLATE運算符將列轉換爲區分大小寫的排序規則,以確保它也可以比較大小寫。

SELECT A, B, C FROM TABLE WHERE D > 'somestring' COLLATE utf8_bin

+0

沒有通配符的'LIKE'與'='相同。我認爲OP的意圖是作爲一種排序機制 - 返回所有記錄,其中D大於(以字母數字排序術語)與表記錄進行比較的字符串。 –

+0

感謝@MikeBrant指出。我忽略了這個問題,並且弄錯了。相應地更正了答案。 – ydoow