2010-01-06 62 views
6

在MySql中,我想定位其中一列中的字符串值以查詢字符串開頭(或相同)的記錄。該列使用適當的整理順序編入索引。儘管列上沒有全文搜索索引。在MySql中,找到具有給定前綴的字符串

一個很好的解決方案:

  1. 使用指數在列。需要遍歷表中所有記錄的解決方案不夠好(表中有數百萬條記錄)

  2. 使用字符串處理任何字符值。某些列值包含標點符號。查詢字符串也可能。請記住,如果你的解決方案包含正則表達式字符或類似的。這些字符串是UTF-8編碼的,但如果您的解決方案僅適用於ASCII,它仍然可能有用。

在這一點上我最接近的是

SELECT * FROM TableName WHERE ColumnName BETWEEN query AND <<query+1>> 

<<query+1>>是預先計算的,以字典順序遵循排序順序query。例如,如果query是「o hai」,那麼<<query+1>>是「o haj」。

回答

19

令人驚訝的是,LIKE查詢將使用索引就好了,如果你正在做前綴搜索。

SELECT * from TableName Where ColumnName LIKE 'o hai%' 

確實會使用索引,因爲它不以通配符開頭。

這(和其他行爲)被記錄在「MySQL如何使用索引」 DOC: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

你需要躲避「%」字符,然後按照正常的報價規則,但比任何UTF其他-8輸入前綴應該工作並完成工作。運行一個EXPLAIN查詢以確保,有時還有其它原因可以從工作,如需要做的OPTIMIZE TABLE更新指標基數(儘管這可能需要年齡和鎖定你的表)

+0

完美 - 謝謝。 EXPLAIN確實表示一個範圍查詢。 LIKE的MySql文檔表明只有以下字符需要轉義:'%','_':http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like 。 – 2010-01-06 07:19:05

+0

我可能會提到,在索引基數確實需要更新的情況下,'ANALYZE TABLE'在理論上比'OPTIMIZE TABLE'快。儘管如此,表格在這段時間仍然處於鎖定狀態。在我的一張600萬行的桌子上運行ANALYZE TABLE花了好一個小時。 – Crast 2010-01-06 07:39:15

2

試試這個排除指標:

SELECT * FROM tablename WHERE columname LIKE CONCAT(query, '%'); 
+1

這將工作很好,直到'查詢'有一個%或一個_在它。他們需要逃脫。 – AndrewF 2016-02-19 04:05:34

相關問題