有效地计算复杂MySQL查询中的结果总数,忽略LIMIT

时间:2014-01-27 17:20:39

标签: mysql performance

我有一个稍微复杂的SQL查询(如下所示)。这会列出table_p的所有行,并应用了一些示例过滤器(例如,在下面,仅显示table_x行引用的行):

我正试图找到一种方法来有效地获得超过LIMIT查询的总结果数。我尝试了两种选择:

  • 使用MYSQL_CALC_ROWS p.id - 结果大大增加了执行它所需的时间。
  • 使用子查询,仅选择x_count(对于过滤器)并将其包装在COUNT(0) FROM ...父查询中。这导致计数查询也非常缓慢(但只比前者略快)。

第二个选项似乎是我测试中最差的,因为第一个查询可以非常快地执行,直到某些过滤器开始应用,然后它变得很慢。进行第二次查询会严重影响速度时间。

在这种情况下,我只能考虑使用MYSQL_CALC_ROWS作为一个可行的选项,但我想知道是否有一种方法我还没有看到或尝试过提高这种查询的效率。< / p>

怪物:

SELECT 
    p.`id`,
    -- Demonstrating usage of two joins to the same table.
    u.`name`,
    u2.`name` AS name2,
    COUNT(x.`id`) AS x_count,

-- p has 0 - 1 of u
-- p has 0 - 1 of u2
-- p has 0 - * of x

FROM 
    `table_p` AS `p` 
LEFT JOIN 
    `table_u` AS `u` 
ON 
    p.`u_id` = u.`id` 
LEFT JOIN 
    `table_u` AS `u2` 
ON 
    p.`u2_id` = u2.`id` 
LEFT JOIN 
    `table_x` AS `x` 
ON 
    p.`id` = x.`p_id` 

WHERE 
    x.`some_column` != 'Some Value' 
AND 
    p.`another_column` <> 'Another Value' 

GROUP BY 
    p.`package_id` 

HAVING
    `x_count` > 0

ORDER BY 
    p.id DESC 

-- Second page, showing 20 results

LIMIT 20, 20`

我们将非常感谢您提供的任何帮助。我正在为最少数万行的系统构建,因此处理时间是指数级的!

0 个答案:

没有答案