3

我正在使用 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之外的所有列的索引。上有一个主键。contentidid

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

4

1 回答 1

0

您是否尝试使用 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 不知道它在并发查询中的表现如何,所以你必须检查这个。

于 2012-04-25T07:00:57.580 回答