0

我们的应用程序中有两个查询,第一个很长,需要 30 秒,然后另一个查询 LIMIT 之前的行数:

SELECT DISTINCT SQL_CALC_FOUND_ROWS res.*,...GROUP BY...HAVING...ORDER BY fqa_value LIMIT 0,10;
SELECT FOUND_ROWS() as count

如果我们取出“ORDER BY fqa_value”,我们可以将速度从 30 秒优化到 1 秒。

所以我把所有东西都放在一个子选择中,然后对其进行排序:

select * from (
    SELECT DISTINCT SQL_CALC_FOUND_ROWS res.*,...GROUP BY...HAVING...LIMIT 0,10;
) as temptable order by fqa_value;

但是,这给了我错误:“SQL_CALC_FOUND_ROWS 的使用/放置不正确”。

如果我取出 SQL_CALC_FOUND_ROWS,它会起作用:

select * from (
    SELECT DISTINCT res.*,...GROUP BY...HAVING...ORDER BY fqa_value LIMIT 0,10
) as temptable order by fqa_value;

但是我没有在 GROUP BY 和 HAVING 之前选择的原始行数。

我如何才能(a)计算原始行数和(b)快速查询?我正在寻找一个纯粹的 MySQL 解决方案,这样我们就不必在必要时更改代码。

4

1 回答 1

1

SQL_CALC_FOUND_ROWS应该先去distinct

SELECT SQL_CALC_FOUND_ROWS DISTINCT res.*,...GROUP BY...HAVING...ORDER BY fqa_value LIMIT 0,10;
SELECT FOUND_ROWS() as count
于 2015-01-23T16:07:12.943 回答