我们在我们的应用程序中有两个查询,第一个很长,需要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解决方案,所以我们不必在必要时更改代码。
答案 0 :(得分: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