优化计数并选择查询

时间:2012-04-25 06:02:52

标签: mysql optimization count full-text-search

我正在使用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;

这确实让我有点不安。这是计数查询的解释:

enter image description here

search_indexcontent上的全文索引。 search_index_no_ft是除contentid之外的所有列的索引。 id上有一个主键。

有没有更好的方法来做到这一点,也许是一种优化这种方式的方法?或者,有没有办法将2个查询(计数和搜索)合并为1?

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查询,所以你必须检查它。