在MySql中,查找具有给定前缀的字符串

Ore*_*ner 8 mysql sql

在MySql中,我想查找其中一列中的字符串值以查询字符串开头(或与查询字符串相同)的记录.该列使用适当的归类顺序编制索引.但是列上没有全文搜索索引.

一个好的解决方案将:

  1. 使用列上的索引.需要迭代表中所有记录的解决方案不够好(表中有数百万条记录)

  2. 使用具有任何字符值的字符串.某些列值包含标点符号.查询字符串也可能.如果您的解决方案包含正则表达式字符或类似字符,请记住这一点.字符串是UTF-8编码的,但如果您的解决方案仅适用于ASCII,它仍然有用.

我现在最接近的是

SELECT * FROM TableName WHERE ColumnName BETWEEN query AND <<query+1>>
Run Code Online (Sandbox Code Playgroud)

在排序顺序中<<query+1>>按字典顺序预先计算的位置query.例如,如果query是"o hai" <<query+1>>则为"o haj".

Cra*_*ast 22

令人惊讶的是,LIKE如果您正在进行前缀搜索,查询将使用索引.

SELECT * from TableName Where ColumnName LIKE 'o hai%'
Run Code Online (Sandbox Code Playgroud)

确实会使用索引,因为它不以通配符开头.

这个(以及其他行为)记录在"MySQL如何使用索引"文档中:http: //dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

您将需要转义'%'字符并遵循正常的引用规则,但除此之外,任何utf-8输入前缀都应该起作用并完成工作.运行EXPLAIN查询以确保有时其他原因可以阻止索引工作,例如需要OPTIMIZE TABLE更新索引基数(尽管这可能需要很长时间并锁定您的表)


Mat*_*ood 5

尝试这个:

SELECT * FROM tablename WHERE columname LIKE CONCAT(query, '%');
Run Code Online (Sandbox Code Playgroud)

  • 在 `query` 中包含 % 或 _ 之前,这会很好用。他们需要逃脱。 (2认同)