這是InnoDB與MySQL 5.7的。MySQL - 索引字符串比較
如果我有這樣的查詢:
SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0
是否有可能具有可以通過查詢使用上D
的指數?即MySQL是否足夠聰明,可以爲STRCMP函數使用btree索引?
如果不是,我怎麼能夠重新設計查詢(和/或表),以便我可以對D進行字符串比較,並且可以有某種形式的修剪,以便它不必擊中每一個行?
這是InnoDB與MySQL 5.7的。MySQL - 索引字符串比較
如果我有這樣的查詢:
SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0
是否有可能具有可以通過查詢使用上D
的指數?即MySQL是否足夠聰明,可以爲STRCMP函數使用btree索引?
如果不是,我怎麼能夠重新設計查詢(和/或表),以便我可以對D進行字符串比較,並且可以有某種形式的修剪,以便它不必擊中每一個行?
驚奇的是許多錯誤的答案爲止。讓我看看我不能加入他們。
STRCMP
根據參數比較的方式返回-1,0或1。
STRCMP(D, 'somestring') > 0
與D > 'somestring'
完全相同。 (不>=
,不=
,不LIKE
)
實際上,有可能是覈對的差異,但是這可以根據需要被處理。
任何函數和某些操作符都可以使用INDEXes
來「隱藏」列。 D > 'somestring'
可受益於從D
開始的索引; STRCMP
版本不能。
謝謝@ rick-james! (還可以使用@ydoow和@ mike-bryant)。這可能聽起來很愚蠢,但我不知道「>」等可以用在字符串操作數上! –
Mysql不會使用索引進行函數調用。
使用下面的查詢和報告d列
SELECT A, B, C FROM TABLE WHERE D ='somestring'
創建索引使用下面的查詢
create index index1 on TABLE(D);
爲什麼不
WHERE D > 'somestring'
這將充分利用創建索引典型B樹索引列D
。
如果僅通過將列值傳遞給諸如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
沒有通配符的'LIKE'與'='相同。我認爲OP的意圖是作爲一種排序機制 - 返回所有記錄,其中D大於(以字母數字排序術語)與表記錄進行比較的字符串。 –
感謝@MikeBrant指出。我忽略了這個問題,並且弄錯了。相應地更正了答案。 – ydoow
用途:WHERE D like%somestring% – kollein
@kollein:對不起,但是這個評論又是如何相關?首先,由於前綴變量,%somestring%會關閉索引。其次,我試圖做字符串比較,而不是子字符串匹配。 –