代码之家  ›  专栏  ›  技术社区  ›  Oren Trutner

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

  •  7
  • Oren Trutner  · 技术社区  · 15 年前

    在MySQL中,我希望找到其中一列中的字符串值以查询字符串开头(或与查询字符串相同)的记录。该列使用适当的排序规则顺序编制索引。不过,该列上没有全文搜索索引。

    一个好的解决方案将:

    1. 使用 指数 在专栏上。需要遍历表中所有记录的解决方案不够好(表中有数百万条记录)

    2. 使用字符串 任何字符值 . 有些列值包含标点符号。查询字符串也可能。如果您的解决方案包含regex字符或类似字符,请记住这一点。字符串是UTF-8编码的,但是如果您的解决方案只使用ASCII,它仍然有用。

    我现在最接近的是

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

    在哪里? <<query+1>> 预先计算为按词典顺序跟随 query 按排序规则顺序。例如,如果 查询 然后是“O海” <<查询+ 1 & gt; 是“啊哈”。

    2 回复  |  直到 15 年前
        1
  •  20
  •   Crast    15 年前

    令人惊讶的是, 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 更新索引基数(尽管这可能会占用时间并锁定表)

        2
  •  4
  •   Matthew Wood    15 年前

    试试这个:

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