我有以下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%';
注意202
和2020i
的区别。
有趣的是,这与数字和字母的组合有关。
例如,尽管最后一个字符串中有更多的字符,但这个查询也在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
,查询再次运行得非常快。它可能不是我问题的实际答案,但解决了我的问题查询太慢。