我试图优化我的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)
使用FULLTEXT:
Showing rows 0 - 24 (1960 total, Query took 0.0033 sec)
我已经阅读了许多教程,其中他们解释了为什么你应该使用FULLTEXT(因为这实际上是通过索引搜索)。但是,如何以较慢的方式检索数据,然后是LIKE语句(因为LIKE语句必须遍历每条记录才能返回其有效性)?
我几乎无法弄清楚为什么会发生这种情况。优化方面的帮助很多!
答案 0 :(得分:1)
除非您将min_word_len设置为小于默认值的数字,否则FULLTEXT
无法找到以1
开头的所有值
如果test_title
是数值(INT,FLOAT等),则LIKE
和FULLTEXT
都是执行查询的可靠方法。
鉴于INDEX(tst_title)
(VARCHAR
或TEXT
),LIKE
可能会运行得更快,因为它只需检查所有条目与1
。
您列出的时间气味就像查询缓存接管一样。出于计时目的,请使用SELECT SQL_NO_CACHE ...
来避免质量控制。
如果您分别使用MATCH
或LIKE
而没有FULLTEXT
或INDEX
,则查询别无选择,只能扫描表格中的所有行
1960 total
来自哪里?时机是否包括计算?
表是MyISAM吗?还是InnoDB? FULLTEXT
中存在可能会影响此主题的差异。
答案 1 :(得分:0)
从我所读过的内容来看,如果您使用...tst_tile LIKE '%1%'
,这将会更慢,因为它必须执行全表扫描并且没有索引。您当前使用右侧通配符的那个可以使用索引,这可能是它比使用FULLTEXT更快的原因。
我自己也不太确定,但这是我读到的,希望它有所帮助。
编辑: 可能希望阅读此答案here以获取有关FULLTEXT与LIKE
的完整说明