文章详情页
mysql - 为什么limit前面加上order by 索引查询性能会更好?
浏览:150日期:2022-06-13 18:26:44
问题描述
问题解答
回答1:找了个2千5百万数据的表进行测试,id是自增主键。
用下面语句进行测试,关query cache,每个连续跑10遍,计算平均耗时:
SELECT * FROM user_orders limit 100000,10;71.3msSELECT * FROM user_orders order by id desc limit 100000,10;83.4 msSELECT * FROM user_orders order by id asc limit 100000,10;69.3msSELECT * FROM user_orders limit 200000,10;133.2msSELECT * FROM user_orders order by id desc limit 200000,10;178.4 msSELECT * FROM user_orders order by id asc limit 200000,10;133.4msSELECT * FROM user_orders limit 10000000,10;6429.5msSELECT * FROM user_orders order by id desc limit 10000000,10;8270.9 msSELECT * FROM user_orders order by id asc limit 10000000,10;6918.7mslimit offset小的时候,加order by走索引只扫少量行更快,而offset较大时,加order by会更慢,全表扫描反而会快。
回答2:如果不加索引,SELECT * FROM sys_client LIMIT 100000,10会将全表扫描,然后取第100001~100010这10条记录; 加了索引之后,就只检索100010条记录,而不是全表检索,所以执行效率会更好!
回答3:在第一条没有 order by 语句中,mysql 处理步骤是这样的:
根据语句取出 10 条数据;
对这十条数据进行排序;
返回这 10 条数据;
但是在第二条语句中,假设你的 id 字段为主键索引,mysql 处理步骤是这样的:
取出 10 条数据;
利用索引顺序直接取得已经排好序的数据;
返回这 10 条数据;
总结一下:如果 order by 的字段在在执行中利用了索引。则可以利用索引顺序而直接取得已经排好序的数据。如果不是,才进行排序操作。
回答4:你的id有加索引吧
回答5:0.0001…… 你需要验证复杂一点的sql
上一条:mysql分组查询问题。面试被问到下一条:mysql事务日志的一些问题
相关文章:
1. node.js - mongoDB使用$gte的问题2. nignx - docker内nginx 80端口被占用3. javascript - webpack 多入口文件生成HTML文件;4. javascript - npm run build后调用api返回index.html5. docker安装后出现Cannot connect to the Docker daemon.6. docker绑定了nginx端口 外部访问不到7. 我在centos容器里安装docker,也就是在容器里安装容器,报错了?8. java - 如图,jsp页面的form中的action是怎么映射到这个位置的?为什么不写dynUser就可以映射到save?9. 关于docker下的nginx压力测试10. 计算机 - 我学习了C语言,数据结构和一点点java基础,想自学C++,请问买什么入门书籍好?
排行榜
