使用MATCH ... AGAINST优化COUNT(*)

时间:2015-10-15 00:27:50

标签: mysql count query-optimization match-against

我正在使用COUNT(*) MATCH() ... AGAINST()。我的具体查询如下:

SELECT COUNT(*) FROM `source_code` WHERE MATCH(`html`) AGAINST ('title');

几秒后我得到了结果:

+----------+
| count(*) |
+----------+
|    17346 |
+----------+
1 row in set (16.30 sec)

多次运行查询后,查询总是需要大约16秒才能完成。

有没有办法加快这个查询?为什么不查询缓存缓存此查询的结果?

如果它有帮助,这里是EXPLAINCREATE 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 wherekey_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声明中没有什么太疯狂。

1 个答案:

答案 0 :(得分:1)

与许多其他数据库不同,当存在覆盖整个表的索引时,mysql非常适合处理select count(*)查询。在你的情况下,你有一个覆盖整个表的索引,但它与普通主键不同,因为它是一个全文索引。

您可以看到查询分析器尝试使用该索引(possible_keys),但它实际上无法使用它。

  

key_len列指示MySQL决定的密钥长度   使用。如果键列为NULL,则长度为NULL。请注意   key_len的值使您可以确定a的多少部分   多部分密钥MySQL实际使用

key_len最不常见的是0而不是null,但这意味着索引的0部分用于查询。

至于如何优化这个?答案是非常困难的。我唯一能想到的是创建一个停用词列表,另一个是设置最小词长。这两个都进入你的my.cnf文件。