Rumah  >  Soal Jawab  >  teks badan

mysql - 为什么limit前面加上order by 索引查询性能会更好?

ringa_leeringa_lee2742 hari yang lalu847

membalas semua(5)saya akan balas

  • PHPz

    PHPz2017-04-17 16:47:33

    找了个2千5百万数据的表进行测试,id是自增主键。

    用下面语句进行测试,关query cache,每个连续跑10遍,计算平均耗时:

    SELECT * FROM user_orders limit 100000,10; 71.3ms
    SELECT * FROM user_orders order by id desc limit 100000,10; 83.4 ms
    SELECT * FROM user_orders order by id asc limit 100000,10; 69.3ms
    SELECT * FROM user_orders limit 200000,10; 133.2ms
    SELECT * FROM user_orders order by id desc limit 200000,10; 178.4 ms
    SELECT * FROM user_orders order by id asc limit 200000,10; 133.4ms
    SELECT * FROM user_orders limit 10000000,10; 6429.5ms
    SELECT * FROM user_orders order by id desc limit 10000000,10; 8270.9 ms
    SELECT * FROM user_orders order by id asc limit 10000000,10; 6918.7ms

    limit offset小的时候,加order by走索引只扫少量行更快,而offset较大时,加order by会更慢,全表扫描反而会快。

    balas
    0
  • PHP中文网

    PHP中文网2017-04-17 16:47:33

    如果不加索引,SELECT * FROM sys_client LIMIT 100000,10会将全表扫描,然后取第100001~100010这10条记录;
    加了索引之后,就只检索100010条记录,而不是全表检索,所以执行效率会更好!

    balas
    0
  • PHPz

    PHPz2017-04-17 16:47:33

    在第一条没有 order by 语句中,mysql 处理步骤是这样的:

    1. 根据语句取出 10 条数据;

    2. 对这十条数据进行排序;

    3. 返回这 10 条数据;

    但是在第二条语句中,假设你的 id 字段为主键索引,mysql 处理步骤是这样的:

    1. 取出 10 条数据;

    2. 利用索引顺序直接取得已经排好序的数据;

    3. 返回这 10 条数据;

    总结一下:
    如果 order by 的字段在在执行中利用了索引。则可以利用索引顺序而直接取得已经排好序的数据。如果不是,才进行排序操作。

    balas
    0
  • 怪我咯

    怪我咯2017-04-17 16:47:33

    你的id有加索引吧

    balas
    0
  • 迷茫

    迷茫2017-04-17 16:47:33

    0.0001…… 你需要验证复杂一点的sql

    balas
    0
  • Batalbalas