ringa_lee
找了个2千5百万数据的表进行测试,id是自增主键。
用下面语句进行测试,关query cache,每个连续跑10遍,计算平均耗时:
limit offset小的时候,加order by走索引只扫少量行更快,而offset较大时,加order by会更慢,全表扫描反而会快。
如果不加索引,SELECT * FROM sys_client LIMIT 100000,10会将全表扫描,然后取第100001~100010这10条记录; 加了索引之后,就只检索100010条记录,而不是全表检索,所以执行效率会更好!
全表扫描
在第一条没有 order by 语句中,mysql 处理步骤是这样的:
order by
mysql
根据语句取出 10 条数据;
对这十条数据进行排序;
返回这 10 条数据;
但是在第二条语句中,假设你的 id 字段为主键索引,mysql 处理步骤是这样的:
id
取出 10 条数据;
利用索引顺序直接取得已经排好序的数据;
总结一下:如果 order by 的字段在在执行中利用了索引。则可以利用索引顺序而直接取得已经排好序的数据。如果不是,才进行排序操作。
你的id有加索引吧
0.0001…… 你需要验证复杂一点的sql
找了个2千5百万数据的表进行测试,id是自增主键。
用下面语句进行测试,关query cache,每个连续跑10遍,计算平均耗时:
limit offset小的时候,加order by走索引只扫少量行更快,而offset较大时,加order by会更慢,全表扫描反而会快。
如果不加索引,SELECT * FROM sys_client LIMIT 100000,10会将
全表扫描
,然后取第100001~100010这10条记录;加了索引之后,就只检索100010条记录,而不是全表检索,所以执行效率会更好!
在第一条没有
order by
语句中,mysql
处理步骤是这样的:根据语句取出 10 条数据;
对这十条数据进行排序;
返回这 10 条数据;
但是在第二条语句中,假设你的
id
字段为主键索引,mysql
处理步骤是这样的:取出 10 条数据;
利用索引顺序直接取得已经排好序的数据;
返回这 10 条数据;
总结一下:
如果
order by
的字段在在执行中利用了索引。则可以利用索引顺序而直接取得已经排好序的数据。如果不是,才进行排序操作。你的id有加索引吧
0.0001…… 你需要验证复杂一点的sql