Mysql全文搜索和GroupBy很慢
我有一个包含以下索引的表:Mysql全文搜索和GroupBy很慢,mysql,Mysql,我有一个包含以下索引的表: PRIMARY KEY (`msg_id`), KEY `ix_msg_user_id` (`msg_user_id`), FULLTEXT KEY `ix_msg_text` (`text`) 如果我只是做一个普通的全文搜索,它会很快并使用全文索引: SELECT * FROM msg WHERE MATCH (msg_text) AGAINST ("some text" IN BOOLEAN MODE); 关于这个问题的解释是: +----+---------
PRIMARY KEY (`msg_id`),
KEY `ix_msg_user_id` (`msg_user_id`),
FULLTEXT KEY `ix_msg_text` (`text`)
如果我只是做一个普通的全文搜索,它会很快并使用全文索引:
SELECT * FROM msg WHERE MATCH (msg_text) AGAINST ("some text" IN BOOLEAN MODE);
关于这个问题的解释是:
+----+-------------+--------+----------+----------------+----------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+-------------+
| 1 | SIMPLE | tweets | fulltext | ix_msg_text | ix_msg_text | 0 | NULL | 1 | Using where |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+-------------+
+----+-------------+--------+----------+----------------+----------------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+----------------------------------------------+
| 1 | SIMPLE | tweets | fulltext | ix_msg_text | ix_msg_text | 0 | NULL | 1 | Using where; Using temporary; Using filesort |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+----------------------------------------------+
现在,如果我执行相同的查询,但向其中添加一个group by,则需要很长时间:
SELECT max(created_at) FROM msg WHERE MATCH (msg_text) AGAINST ("some text" IN BOOLEAN MODE) group by msg_user_id;
关于该问题的解释如下:
+----+-------------+--------+----------+----------------+----------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+-------------+
| 1 | SIMPLE | tweets | fulltext | ix_msg_text | ix_msg_text | 0 | NULL | 1 | Using where |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+-------------+
+----+-------------+--------+----------+----------------+----------------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+----------------------------------------------+
| 1 | SIMPLE | tweets | fulltext | ix_msg_text | ix_msg_text | 0 | NULL | 1 | Using where; Using temporary; Using filesort |
+----+-------------+--------+----------+----------------+----------------+---------+------+------+----------------------------------------------+
我尝试添加另一个包含文本和用户id的索引,如下所示:
ALTER TABLE ADD FULLTEXT INDEX `msg_msg_user_id` (`msg_text`, `msg_user_id`);
ERROR 1283 (HY000): Column 'msg_user_id' cannot be part of FULLTEXT index
但是,它不允许我这样做,因为msg_user_id是一个int,不能作为全文索引的一部分。加快此查询速度的最佳方法是什么?不使用任何聚合函数进行分组是没有意义的。@Mihai是的,我的错,这是我问题的一个简化示例,在实际查询中,我有一个max,将编辑问题您可以将文本搜索放入
HAVING
子句中吗。这没有多大意义,但分组后进行搜索会加快速度吗?针对松散索引扫描,在您的示例查询中,您需要在(msg_user_id,created_at)@dan08上创建一个组合索引将其移动到HAVING子句速度很快,但这样它只会搜索部分文本,查询需要找到包含该文本的所有消息,然后按用户分组\u idGrouping by没有任何聚合函数是没有意义的。@Mihai是的,我的错,这是我问题的一个简化示例,在实际查询中,我有一个max,将编辑问题您可以将文本搜索放在HAVING
子句中吗。这没有多大意义,但分组后进行搜索会加快速度吗?针对松散索引扫描,在您的示例查询中,您需要在(msg_user_id,created_at)@dan08上创建一个组合索引将其移动到HAVING子句速度很快,但这样它只会搜索部分文本,查询需要找到包含该文本的所有消息,然后按用户id分组