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

用于REGEXP的MySQL优化

仲孙才捷
2023-03-14
问题内容

在我的慢速查询日志中,此查询(使用不同的名称而不是“ jack”)发生了很多次。为什么?

Users表具有许多字段(超过我选择的这三个字段)和大约40.000行。

select name,username,id from Users where ( name REGEXP '[[:<:]]jack[[:>:]]' ) or ( username REGEXP '[[:<:]]jack[[:>:]]' ) order by name limit 0,5;

id是主要的,并且是自动递增的。
name有一个索引。
username具有唯一索引。

有时需要3秒钟!如果我在MySQL上解释选择,我会得到:

select type: SIMPLE
table: Users
type: index
possible keys: NULL
key: name
key len: 452
ref: NULL
rows: 5
extra: Using where

这是我能做的最好的吗?我该如何解决?


问题答案:

如果必须使用regexp-style
WHERE子句,则肯定会遇到查询缓慢的问题。为了使regexp样式的搜索有效,MySQL必须将name列中的每个值与regexp进行比较。而且,通过查看用户名列,您的查询使麻烦增加了一倍。

这意味着MySQL无法利用任何索引,这就是所有DBMS加快大型表查询的方式。

您可以尝试一些方法。所有这些都涉及告别REGEXP。

一个是这样的:

WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')

如果您在名称和用户名列上创建索引,则应该会很快。它将查找以“ jack”开头的所有名称/用户名。注意

WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */

会寻找以“ jack”结尾的名称,但会像您的正则表达式样式搜索一样缓慢。

您可以做的另一件事是弄清楚为什么您的应用程序需要能够搜索名称或用户名的一部分。您可以从应用程序中删除此功能,或者找出一些更好的html" target="_blank">方法来处理它。

可能的更好方法:

  1. 要求您的用户将其名字分解为“给定名称”和“姓氏”字段,然后分别进行搜索。
  2. 创建单独的“搜索所有用户”功能,该功能仅在用户需要时才使用,从而减少了慢速正则表达式样式查询的频率。
  3. 您可以使用某种预处理程序将它们的名称分解成一个单独的名称-单词表。搜索没有正则表达式的名称单词表。
  4. 弄清楚如何使用MySQL全文搜索来实现此功能。

所有这些都涉及一些编程工作。



 类似资料:
  • 问题内容: 我问这个问题以展示MySQL和Hibernate如何通过正则表达式相互配合。 问题: 解: 转到我的答案。 希望这可以帮助。 问题答案: 基本上,要在Hibernate中使用MySQL regexp函数,我们需要创建一个“ SQLFunctionTemplate”。 现在,如何做: 首先:创建一个名为“ AppMySQLDialect”的类,并从MySQLDialect扩展,然后覆盖空

  • 我正在尝试为java找到一个正则表达式,该表达式匹配所有没有在插入、更新、删除、过程等关键字之前的选择语句查询: 此刻at得到了这个: 但如果select从新行开始,则不匹配正确: 测试用例: 结果:仅匹配<代码>从dual中选择1 此链接有测试用例: https://regex101.com/r/2wkbOk/1

  • 问题内容: 下面的MySQL表达式等效于SQL Server? 问题答案: 不幸的是,mssql中对regex的支持令人恐惧,最接近的运算符是“ like”,这使regex的功能远远漏掉了。您将不得不考虑将正则表达式分解为多个类似的语句,并可能进行一些肮脏的字符串操作以模仿您要实现的目标。 例如,虽然我们可以用[]复制[[:blank:]](请阅读[空格键]),但我们不能强制匹配零个或多个它们,因

  • 问题内容: 我正在尝试编写一个正则表达式验证:1到99之间的一组(或多个)数字用|或分隔,(可以将两者组合) 例 必须接受: 必须拒绝: 对于数字组,其直截了当:[1-9][0-9]。对于其余部分,这仍然是个谜。 题 有人可以协助提出正确的正则表达式吗? 问题答案: 说明:

  • 问题内容: 我正在创建用于密码验证的正则表达式,以在Java应用程序中用作配置参数。 regexp是: 密码策略为: 至少8个字符 包含至少一位数字 包含至少一个较低的alpha字符和一个较高的alpha字符 在一组特殊字符(@#%$^等)中包含至少一个字符 不包含空格,制表符等。 我只缺少第5点。我无法进行正则表达式检查空间,制表符,回车等。 有人可以帮我吗? 问题答案: 尝试这个: 说明: 由

  • 问题内容: 我试图用过滤器创建一个表,当我需要通过正则表达式查找行时,我在下面出现了错误。我如何将RegExp与Number的字段类型一起使用?更改String的字段类型,这是个好主意吗? 在路径“数字”处将值“ / 555 /”转换为数字失败 问题答案: 当然,正则表达式仅适用于字符串。但是,您仍然可以这样做,尽管这样做效率非常低: MongoDB 查询运算符允许在服务器上针对集合中的每个文档或