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分组