MySQL中数据库索引对正则表达式查询的影响

Ami*_*t P 2 regex mysql sql database indexing

数据库索引的目的是使查找速度更快,但是在索引列的 where 子句中使用正则表达式的查询的性能如何。

假设我们有一个FILES包含字段的表FILE_NAME,并且在 FILE_NAME 上创建了一个索引。

然后我们有一个搜索具有匹配名称模式的文件的查询

SELECT * FROM FILES WHERE FILE_NAME RLIKE regexp
Run Code Online (Sandbox Code Playgroud)

在 FILE_NAME 上创建索引是否有助于提高上述查询的性能?

sym*_*ean 6

是的,它可能会提高性能 - 但不是你想象的那样。

在正常使用中,索引允许 DBMS 查找表中的行,而无需扫描每个条目 - 它可以跳过一些条目(对于范围比较、特定值和部分匹配,例如但LIKE 'ABC%'不适用于使用 的查询LIKE '%XYZ')。当您尝试使用某些数据转换来查找行时(尽管有语法,RLIKE 是基于操作数而不是运算符的函数),DBMS 必须将转换应用于表的每一行。一些 DBMS(例如 Oracle)支持基于函数的索引,因此只要您的正则表达式是恒定的,您就可以定义基于正则表达式匹配的索引 - MariaDB 支持可以索引的虚拟列,这相当于相同的事情。

因此,在这里使用索引不会减少 DBMS 为了过滤查询而必须获取的行数。

但是,如果匹配数相对于基础数据中的行数较低,并且索引的宽度相对于表行的宽度相对较小,则 DBMS 可以通过从索引读取来识别匹配行 -与读取表行相比,这会更快并且需要更少的 I/O 操作。OTOH 如果索引并不比它所代表的表更紧凑,并且索引没有覆盖(即查询中的所有项都可以从索引中满足),那么您将获得比没有索引更差的性能 - 因为 DBMS 必须执行每次匹配后进行额外的查找和读取操作以获取数据 - 事实上,如果没有明确的提示,DBMS 可能永远不会使用这样的索引。