在MySql中,我想查找其中一列中的字符串值以查询字符串开头(或与查询字符串相同)的记录。该列使用适当的归类顺序编制索引。但是列上没有全文搜索索引。
一个好的解决方案是:
使用列上的索引。需要迭代表中所有记录的解决方案不够好(表中有数百万条记录)
使用任何字符值的字符串。某些列值包含标点符号。查询字符串也可能。如果您的解决方案包含正则表达式字符或类似字符,请记住这一点。字符串是UTF-8编码的,但如果您的解决方案仅适用于ASCII,那么它仍然有用。
此时我最接近的是
SELECT * FROM TableName WHERE ColumnName BETWEEN query AND <<query+1>>
预先计算<<query+1>>
以按字典顺序排列整理顺序中的query
。例如,如果query
为“o hai”,则<<query+1>>
为“o haj”。
答案 0 :(得分:20)
令人惊讶的是,如果您正在进行前缀搜索,LIKE
查询将使用索引。
SELECT * from TableName Where ColumnName LIKE 'o hai%'
确实会使用索引,因为它不以通配符开头。
这个(以及其他行为)记录在“MySQL如何使用索引”文档中: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
您将需要转义'%'字符并遵循正常的引用规则,但除此之外,任何utf-8输入前缀都应该起作用并完成工作。运行EXPLAIN
查询以确保有时其他原因可以阻止索引工作,例如需要执行OPTIMIZE TABLE
更新索引基数(尽管这可能需要很长时间并锁定您的表)
答案 1 :(得分:4)
试试这个:
SELECT * FROM tablename WHERE columname LIKE CONCAT(query, '%');