我正在使用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?
答案 0 :(得分:0)
您是否尝试使用SQL_CALC_FOUND_ROWS?它的工作原理如下:
SELECT SQL_CALC_FOUND_ROWS some_fields FROM table WHERE xxx LIMIT 10;
SELECT FOUND_ROWS();
唯一的限制是你必须在第一个查询后立即执行第二个查询
更多关于mysql docs:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
不知道它如何使用concurent查询,所以你必须检查它。