有什么聪明的方法可以避免在全文搜索过程中使用group by吗?
SELECT p.topic_id, min(p.post_id)
FROM forum_posts AS p
WHERE MATCH (p.post_text) AGAINST ('baby shoes' IN BOOLEAN MODE)
GROUP BY p.topic_id
LIMIT 20;在本例中,它为匹配文本的唯一post_id获取最低的topic_ids。
为了找到最小值,这个组在一个百万行数据库中花费了600‘s,检查了大约50K行。
如果我去掉了分钟,但离开了小组,这是同样的慢,所以这是组击中。
我怀疑这是因为它只能使用一个索引,全文?
key: post_text | Using where; Using temporary; Using filesort
Query_time: 0.584685 Lock_time: 0.000137 Rows_sent: 20 Rows_examined: 57751
Full_scan: No Full_join: No Tmp_table: Yes Tmp_table_on_disk: No
Filesort: Yes Filesort_on_disk: No Merge_passes: 0如果没有分组,它是1ms,所以这必须是文件的速度吗?
(我已经删除了命令和其他一切来隔离命中的地方)
谢谢你的洞察力和想法。
(如果重要的话,在mariadb下使用MyISAM )
发布于 2013-02-24 15:34:21
您可以尝试查看tmp_table_size变量并增加它。组by必须使用临时表进行文件排序。临时表很可能超出了允许的大小,并被转储到磁盘进行最后的排序处理(非常慢)。
如果你这样做了:
SHOW VARIABLES LIKE 'CREATED_TMP%' 看看Created_tmp_tables与created_tmp_disk_tables的比率,这会告诉你这个值是否太小。
另见:http://dev.mysql.com/doc/refman/5.0/en/internal-temporary-tables.html
https://dba.stackexchange.com/questions/35339
复制相似问题