繁体   English   中英

优化计数并选择查询

[英]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_indexcontent的全文索引。 search_index_no_ft是除contentid之外的所有列的索引。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM