下面以Mysql来举例说明。
SELECT * FROM operation
WHERE type = 'SQLStats' AND NAME = 'SlowLog'
ORDER BY create_time
LIMIT 1000, 10;
先看上面这条SQL,是不是就是我们平时写的分页SQL,如果数据库大的时候,我们会在数据库中用 type, name, create_time 字段上加组合索引,以此达到优化的目的。
但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,你会发现SQL怎么又变慢了?要知道数据库也并不知道第1000000条记录从什么地方开始,即使有索引也需要从头计算一次。出现这种性能问题,多数情形下是程序员偷懒了。
在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的。SQL 重新设计如下:
SELECT * FROM operation
WHERE type = 'SQLStats' AND name = 'SlowLog' AND create_time > '2017-03-16 14:00:00'
ORDER BY create_time
limit 10;
在新设计下查询时间基本固定,不会随着数据量的增长而发生变化。