【问题标题】:How come MySQL LIKE is faster then FULLTEXT?为什么 MySQL LIKE 比 FULLTEXT 快?
【发布时间】:2015-09-03 08:02:23
【问题描述】:

我试图优化我的 MySQL 查询,但发现我实际上做错了。我已将查询更改为使用

SELECT * FROM test WHERE tst_title LIKE '1%'

收件人:

SELECT * FROM `test` WHERE MATCH(tst_title) AGAINST("+1*" IN BOOLEAN MODE)

FULLTEXT 的运行时间很糟糕。请看下面的内容:

使用喜欢:

Showing rows 0 - 24 (1960 total, Query took 0.0004 sec)

使用全文:

Showing rows 0 - 24 (1960 total, Query took 0.0033 sec)

我阅读了许多教程,其中解释了为什么应该使用 FULLTEXT(因为这实际上是按索引搜索)。但是,这会是一种较慢的方式来检索数据,然后是 LIKE 语句(因为 LIKE 语句必须遍历每条记录才能返回它们的有效性)?

我真的不明白为什么会发生这种情况.. 优化方面的帮助会很受欢迎!

【问题讨论】:

标签: mysql sql performance optimization phpmyadmin


【解决方案1】:
  • 除非您将 min_word_len 设置为小于默认值,否则FULLTEXT 无法找到所有以1 开头的值

  • 如果test_title 是一个数值(INT、FLOAT 等),那么LIKEFULLTEXT 都是很糟糕的查询方式。

  • 给定INDEX(tst_title)(它是VARCHARTEXT),那么LIKE 可能运行得更快,因为它只需要检查所有以1 开头的条目。

  • 您列出的时间看起来像是被查询缓存接管了。出于计时目的,请使用SELECT SQL_NO_CACHE ... 来避免 QC。

  • 如果使用MATCHLIKE 而没有分别使用FULLTEXTINDEX,则查询别无选择,只能扫描表中的所有行。

  • 1960 total 是从哪里来的?时间是否包括计算?

  • 表是 MyISAM 吗?还是 InnoDB? FULLTEXT 存在差异,这可能会影响此线程。

【讨论】:

  • 要回答你所有的问题,是的,我的表是 InnoDB 并且变量 min_word_len 设置为 1。我也尝试禁用 QC,但时间差异仍然较慢。除此之外,我还想提一下 DATA 类型是 VARCHAR。我现在将尝试 INDEX() 函数。 P.S:1960 年,我们是受影响的行,包括 '1'。
  • 我假设你设置了innodb_ft_min_token_size。什么得到了1960? SQL_CALC_FOUND_ROWS?单独的COUNT(*)?还有什么?表格有多少行?
【解决方案2】:

根据我的阅读,如果您使用...tst_tile LIKE '%1%',这会更慢,因为它必须执行全表扫描并且没有索引。您当前在右侧带有通配符的那个可以使用索引,这可能是它比使用 FULLTEXT 更快的原因。

我自己也不太清楚,但这是我读到的,希望对你有帮助。

编辑: 可能想阅读这个答案here 以获得关于 FULLTEXT 与 LIKE 的完整解释

【讨论】:

  • 即使使用两个通配符,LIKE 也比 FULLTEXT 快。使用 LIKE '%1%' 给了我更多的行 + 更快的运行时间..
  • 您是否也尝试过使用 CONTAINS 并将其与 LIKE 和 FULLTEXT 进行比较?
  • 我做到了,但运行时变得更糟。 LIKE 似乎是最快的,只使用一个通配符。不知道为什么..
  • 我在 SO 上包含了一个与您类似的另一个问题的链接,第一个答案深入描述了没有真正的性能改进。这是一个有趣的阅读。抱歉,我无法提供进一步的见解。
  • 我读过了,不过还是谢谢你的链接。现在自己做一些研究。希望我能找到一种方法来优化我的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2016-08-27
  • 2021-11-04
  • 2010-12-29
  • 1970-01-01
  • 2019-11-02
  • 2012-09-03
相关资源
最近更新 更多