84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
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