Answers:
不,那几乎就是他们在做什么。现在,如果没有前导通配符并且对该字段建立了索引(这是通常的情况),则数据库引擎可以将正则表达式应用于索引。因此,例如,如果您写
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
数据库可以使用索引on LAST_NAME
查找姓氏以'Cav'开头的所有行。另一方面,如果您有类似
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
数据库将不得不扫描整个表(或整个索引),并根据完整LAST_NAME
值评估表达式。显然,这非常昂贵。
大多数更好的关系数据库都具有通过构建不同种类的索引和文本目录,以更有效的方式进行全文搜索的功能,但是它们不使用LIKE关键字。例如,这是一篇不错的文章,讨论了PostgreSQL中的全文本搜索。
LAST_NAME
成为聚簇索引(第一列)的候选人?pps该答案在多大程度上假定数据库系统基于磁盘和B树索引上的连续存储?
除了Justin Cave撰写的内容之外,自PostgreSQL 9.1起,您可以使用()或()以及基本正则表达式匹配()来加快任何搜索的速度。将pg_trgm模块提供的运算符类与GIN或GiST索引一起使用,可以加快非左锚表达式的速度。要安装扩展,请对每个数据库运行一次:LIKE
~~
ILIKE
~~*
~
LIKE
CREATE EXTENSION pg_trgm;
创建表单的索引
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
要么:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
创建和维护GIN或GiST索引需要付出一定的代价,但是如果您的表没有被大量编写,那么这对您来说是一个很棒的功能。
GiST和GIN索引之间的选择取决于GiST和GIN的相对性能特征,这将在其他地方讨论。根据经验,GIN索引的搜索速度比GiST索引要快,但构建或更新速度却较慢;因此GIN更适合静态数据,而GiST更适合经常更新的数据。
但是对于使用“距离”运算符的“最近邻居”类型的查询<->
:
这可以通过GiST索引非常有效地实现,而不能通过GIN索引有效地实现。
说到MySQL,通配符(%)的位置会有所不同。如果像指定文本的第一部分where first_name like 'Sta%'
,那么DB引擎只搜索词用在看我们,然后去圣,一个较小的子,然后站等,如果你这样做where first_name like '%stan%'
,然后和整个扫描列将是必需的。您还可以查看全文索引,该索引也可以进行自然语言搜索。在此处查看MySQL文档。