记一次mysql关于limit和orderby的优化
2024-10-09 11:46:23
针对于大数据量查询,我们一般使用分页查询,查询出对应页的数据即可,这会大大加快查询的效率;
在排序和分页同时进行时,我们一定要注意效率问题,例如:
select a.*
from table1 a
inner join table2 b on xx=xx
inner join table3 c on xx=xx
and c.xx=(select b.xx from b where b.xx=?)
where
a.xx=? and b.xx=?
order by a.xx
limit 5
在这种情况下,当数据量上来的时候,效率会非常低下,下面我们来分析一下影响性能的因素
- a表和b表where条件中的字段是否有索引,是否使用了索引,使用索引将会加快查询速度,可以用explain查看
c.xx=(select b.xx from b where b.xx=?)使用了子查询,尽量杜绝没必要的子查询,子查询会解释为外链接,多余的连接表带来额外的开销
- 当查询的a表字段非常多时,会对a表这些字段进行排序,然后limit进行查找前n个,抛弃前n个,再找m个进行返回
针对于上面的分析,提出以下解决方案:
- 增加查询字段、排序字段的索引或联合索引,增加表连接字段索引
- 把多余的子查询去掉,条件放在表的连接上
- 新建子查询,避免对过多的字段进行order by和limit,减少I/O开销
select a.*
from table1 a
where a.id in
( select a.id
from table1 a
inner join table2 b on xx=xx
inner join table3 c on xx=xx and xx=xx
where
a.xx=? and b.xx=?
order by a.xx
limit 5)
这样的话会大大提升mysql查询性能
最新文章
- JavaScript读书笔记(一)
- Windows上模拟Linux环境
- ASP.NET MVC 4 Ajax上传文件
- 轮子来袭 vJine.Core Orm 之 01_快速体验
- (转载)Ant教程
- 浅谈Mybatis(三)
- Tomcat 用户配置
- QT修改默认的滚动条样式
- shell打印 菱形
- 2017-12-15python全栈9期第二天第五节之while else的用法二当不被break打断时else内容的结果会被打印
- tomcat8 manager页面限制IP访问
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
- 前端性能优化之按需加载(React-router+webpack)
- Java并发编程总结5——ThreadPoolExecutor
- jenkins 批量修改 去掉勾选Build whenever a SNAPSHOT dependency is built
- MySQL只有.frm文件恢复表结构
- VC++ 操作Windows快捷方式
- loadrunner12-错误 -26366: 找不到 web_reg_find 的“Text=19728.00”
- MySQL安装和Navicat安装、破解
- [CF489D]Unbearable Controversy of Being
热门文章
- 新建maven项目总是需要重新选择maven的配置文件
- 【react】实现动态表单中嵌套动态表单
- 解决autocomplete=off在Chrome中不起作用的方法
- css3 pointer-events(阻止hover、active、onclick等触发事件)
- 洛谷 P2882 [USACO07MAR]Face The Right Way G
- 一文了解HAProxy主要特性
- appium移动端自动化测试环境搭建windows-appium-android
- 全局作用域中,用 const 和 let 声明的变量不在 window 上,那到底在哪里?如何去获取?
- java 面向对象(二十八):异常 一
- 深度理解SpringIOC,面试你根本不需要慌!