为什么这个MySQL查询在添加1或2个字符到搜索字符串时不成比例地长得多?



我有以下SQL查询:

SELECT * FROM table WHERE text LIKE '%15%'
AND text LIKE '%10%'
AND text LIKE '%202%';

表中约有40000个条目,文本内容约60000个字符。

当我执行查询相当快…持续时间约0.05秒。

问题是,当我在最后一个字符串中添加两个字符时,它已经需要15秒了:

SELECT * FROM table WHERE text LIKE '%15%'
AND text LIKE '%10%'
AND text LIKE '%2020i%';

注意2022020i的区别。

有趣的是,这与数字和字母的组合有关。

例如,尽管最后一个字符串中有更多的字符,但这个查询也在0.05秒内执行:

SELECT * FROM table WHERE text LIKE '%15%'
AND text LIKE '%10%'
AND text LIKE '%information%';

使用information2代替information虽然…执行时间上升到17秒。

如果这是由预定义字符集引起的,可能是一些吗?还有一些模式,比如& 2i"或";i2"由DB以某种方式解释?只是一个想法……所有列的字符集为utf8,排序规则为utf8_general_ci

感谢您的帮助!

编辑:

在这里有问题的表!

CREATE TABLE `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`text` mediumtext CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
FULLTEXT KEY `text` (`text`)
) ENGINE=MyISAM AUTO_INCREMENT=889823 DEFAULT CHARSET=latin1

全文索引是在基于文本的列(CHAR、VARCHAR或TEXT列)上创建的,以加快对这些列中包含的数据的查询和DML操作。

全文索引
ALTER TABLE your_table_name ADD FULLTEXT INDEX `FullText` ('col1', 'col2', 'col3', 'etc');

似乎我的问题的答案是为什么查询花费这么长时间与特定的text列的排序设置有关。在比较字符串时,排序规则utf8似乎对性能有很大的影响。数据库的默认排序是latin1,我不确定性能影响是否出现,因为数据库内部转换列内的任何数据,而不是默认字符集默认(latin1),或者因为表示本身只是次优时执行字符串匹配,然而,我猜一些字符模式只是采取不成比例的更长时间时使用utf8排序。我将text列的排序改为latin1,查询再次运行得非常快。它可能不是我问题的实际答案,但解决了我的问题查询太慢。

最新更新