我正在使用COUNT(*)
MATCH() ... AGAINST()
。我的具体查询如下:
SELECT COUNT(*) FROM `source_code` WHERE MATCH(`html`) AGAINST ('title');
几秒后我得到了结果:
+----------+
| count(*) |
+----------+
| 17346 |
+----------+
1 row in set (16.30 sec)
多次运行查询后,查询总是需要大约16秒才能完成。
有没有办法加快这个查询?为什么不查询缓存缓存此查询的结果?
如果它有帮助,这里是EXPLAIN
和CREATE TABLE
声明:
EXPLAIN SELECT COUNT(*) FROM `source_code` WHERE MATCH(`html_w`) AGAINST ('title');
+----+-------------+-------------+----------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+----------+---------------+--------+---------+------+------+-------------+
| 1 | SIMPLE | source_code | fulltext | html | html | 0 | | 1 | Using where |
+----+-------------+-------------+----------+---------------+--------+---------+------+------+-------------+
看起来正在使用索引。 (也许开销是查询仍为Using where
?key_len
为0是否正常?)
SHOW CREATE TABLE `source_code`;
CREATE TABLE `source_code` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL,
`domain` varchar(255) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`html` longtext,
`crawled` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`),
KEY `crawled` (`crawled`),
KEY `domain` (`domain`),
FULLTEXT KEY `html` (`html`)
) ENGINE=MyISAM AUTO_INCREMENT=78707 DEFAULT CHARSET=latin1
CREATE TABLE
声明中没有什么太疯狂。
答案 0 :(得分:1)
与许多其他数据库不同,当存在覆盖整个表的索引时,mysql非常适合处理select count(*)查询。在你的情况下,你有一个覆盖整个表的索引,但它与普通主键不同,因为它是一个全文索引。
您可以看到查询分析器尝试使用该索引(possible_keys),但它实际上无法使用它。
key_len列指示MySQL决定的密钥长度 使用。如果键列为NULL,则长度为NULL。请注意 key_len的值使您可以确定a的多少部分 多部分密钥MySQL实际使用
key_len最不常见的是0而不是null,但这意味着索引的0部分用于查询。
至于如何优化这个?答案是非常困难的。我唯一能想到的是创建一个停用词列表,另一个是设置最小词长。这两个都进入你的my.cnf文件。