[英]Optimize count and select query
我正在使用MySQL 5.5。 我有一个使用子查询的查询(全文)。 为了帮助提高性能以及我使用分页的事实,我使用LIMIT来限制结果的数量。
SELECT *
FROM (
SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id
FROM search_index
WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id ) as search
GROUP BY search.type, search.type_id DESC LIMIT 10;
问题是,除此之外,我需要发回每个搜索查询的可能结果总数,例如(50000)。 为了计算,我正在使用:
SELECT COUNT(*) FROM(
SELECT *
FROM (
SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id
FROM search_index
WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id ) as search
GROUP BY search.type, search.type_id) as count;
这确实让我有点不安。 这是计数查询的解释:
search_index
是content
的全文索引。 search_index_no_ft
是除content
和id
之外的所有列的索引。 id
上有一个主键。
有没有更好的方法来做到这一点,也许是一种优化这种方式的方法? 或者,有没有办法将2个查询(计数和搜索)合并为1?
您是否尝试使用SQL_CALC_FOUND_ROWS? 它的工作原理如下:
SELECT SQL_CALC_FOUND_ROWS some_fields FROM table WHERE xxx LIMIT 10;
SELECT FOUND_ROWS();
唯一的限制是您必须在第一个查询后立即执行第二个查询。
更多关于mysql文档: http : //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
不知道它是如何使用concurent查询,所以你必须检查这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.