Mysql使用通配符提高搜索性能(%%)

Chr*_*nch 11 mysql sql indexing query-optimization

以下是我用于通过电子邮件搜索某人的查询

  SELECT *
    FROM phppos_customers
    JOIN phppos_people ON phppos_customers.person_id = phppos_people.person_id
   WHERE deleted = 0
     AND email LIKE '%f%'
ORDER BY email ASC
Run Code Online (Sandbox Code Playgroud)

在"电子邮件"上添加索引会加快查询速度吗?

Bra*_*rad 17

不,因为当你有一个领先的通配符时,MySQL将无法使用索引.如果您将LIKE更改为'f%',那么它将能够使用索引.


man*_*nji 7

不,Mysql不会使用索引,因为LIKEargument(%f%)以通配符开头%.如果以常量开头,则使用索引.

更多信息:7.5.3.MySQL如何使用索引


OMG*_*ies 5

通配操作的左侧LIKE可确保email无法使用列上的索引(如果存在).

全文搜索(FTS)是通过SQL在文本中查找字符串的首选语法. MySQL具有本机FTS功能,使用MATCH/AGAINST语法(要求该表使用My.5AM引擎进行v.5.5及更低版本.v.5.6 +支持InnoDB FTS):

  SELECT c.*, p.*
    FROM PHPPOS_CUSTOMERS c
    JOIN PHPPOS_PEOPLE p ON p.person_id = c..person_id
   WHERE deleted = 0
     AND MATCH(email) AGAINST('f')
ORDER BY email 
Run Code Online (Sandbox Code Playgroud)

但是有第三方FTS技术,比如Sphinx.

  • 这是非常无用的,因为 FTS 将完整的单词添加到索引中,而通配符 %% 允许您进行部分搜索。MySQL 有 ngram 类型的 FTS 索引,但是在尝试复制时非常没用:%% 行为,因为它不支持最小/最大 ngram 大小(例如 ElasticSearch 所做的),只有一个 `ngram_token_size`。 (2认同)