当前位置: 首页 > 面试题库 >

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

淳于泓
2023-03-14
问题内容

在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”。


问题答案:

出乎意料的是,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进行更新索引基数的操作(尽管这可能会花费很多时间并锁定您的表)



 类似资料:
  • 问题内容: 我在Ubuntu上,我想在当前目录和子目录中找到名称包含字符串“ John”的所有文件。我知道可以匹配文件中的内容,但是我不知道如何在文件名中使用它。任何帮助,将不胜感激。 问题答案: 使用find命令,

  • 我有一个HBase表,其中一些信息被编码在限定符名称中。类似于这样: 我需要找到所有具有特定限定符前缀的行(包括所有列)。在上面的示例中,如果查找,我只想查找和。 有没有一种方法来实现我试图用标准过滤器做的事情?

  • 问题内容: 我有一个像这样的数组: 我想找到字符串的最长公共前缀。在这种情况下, 我以为我会遵循这个程序 问题 是否有内置函数或更简单的方法? 对于我的5行数组来说可能还不错,但是如果我要做几千行数组,那么将会有很多开销,所以我必须使用起始值进行移动计算,例如=字符串的一半,如果它失败,然后直到它起作用,然后再递增1直到我们成功。这样我们就可以进行最少的比较以获得结果。 是否已经有解决此类问题的公

  • 问题内容: 我有绳子。我想通过更改字符串中的字符顺序来从该字符串生成所有排列。例如,说: 我想要的是这样的清单, 目前,我正在迭代字符串的列表强制转换,随机选择2个字母并将它们换位以形成新的字符串,然后将其添加到设置的l强制转换中。根据字符串的长度,我正在计算可能的排列数量,并继续迭代直到集合大小达到极限。必须有更好的方法来做到这一点。 问题答案: itertools模块具有一个有用的方法,称为p

  • 在我的脚本中,我有一个字符串及其前缀/后缀。我需要从原始字符串中删除前缀/后缀。 例如,假设我有以下值: 如何得到以下结果?

  • 问题内容: 如何仅列出具有给定前缀()的数据库? 例: 输出: 预期产量: 奖金: 在我的情况下,可以在不定义new 的情况下创建数据库吗? 我的目标是仅在具有前缀的数据库上运行查询,所以可能存在比列出数据库更好的解决方案,然后在每个数据库上运行查询吗? 问题答案: 只需按表示数据库名称的属性进行过滤。要列出以给定前缀开头的数据库,可以使用regexp为: 其他过滤器选项在命令页面上列出: 您可以