我很难优化像
这样的查询SELECT RESULT_ID FROM RESULTS
WHERE SOURCE = 1 AND GROUP=2 AND SCORE1 BETWEEN 20 AND 100
ORDER BY SCORE2 LIMIT 450;
在一个 4000 万行的 innodb 表上。查询可能需要对多达 1500 万个结果进行排序才能获得前 450 个结果。到目前为止,我已经尝试过:
- 定义索引,但不习惯用于排序,因为 MySQL 忽略范围条件后索引中的任何列。因为我们 有一堆分数列,我们可以得到范围条件 他们的数量,然后按特定分数排序,然后 将结果集限制在前 450 个。
- 使用内存表,但在对如此大的结果进行排序时效果不佳。
- Sphinx,但我不确定它是否有助于此类查询。
此外,是否有任何 OLAP 多维数据集实现可以优化此类查询?
最佳答案
我建议创建一个单独的表来保存这 450 行,并在每次插入新行或更新旧行时计算并引用另一个表。
这样您的查询就不需要每次都浏览所有行。
关于mysql - 优化前 N 个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7022503/