MySQL查询优化
来源:互联网 发布:郑州seo公司hncxnet 编辑:程序博客网 时间:2024/05/29 18:53
最近做项目遇到一些查询优化的问题,所以特意花了点时间研究了一下MySQL的查询优化,特此记录。
先说下遇到的问题。项目里有个sql,大概是这个样子的:
select tba.col... from tba where col1>'2017-06-01' and col1<'2017-06-30' and col2 in(select value from tbc where name='aaa') union all select tba.col... from tba left join tbb on tba.id=tbb.tba_id where tbb.col1>'2017-06-01' and tbb.col1<'2017-06-30' and tba.col2 in(select value from tbc where name='bbb') limit 2000原先的sql是没有union all 后面的部分的,用着一致没问题,最近做了一些业务调整,所以sql也跟着动了一下。结果一上线,发现sql严重慢查(此处敲个钟,上线的sql最好在线上环境做个执行测试,没问题了再上),导致线上功能受影响。出了问题赶紧查,初步看了一下,tba和tbb的col1都是有索引的,并且各自的查询返回数据量最多也就十来万,应该也没啥问题。那问题到底出在哪里呢?又把sql捋了一遍,感觉会不会是子查询的问题。为了验证,我把子查询抽出来,将查询结果查出来作为条件传进sql,然后惊奇地发现查询速度一下就快了。上网查了一下,MySQL似乎做了这样一件事:先查出外部sql的结果,然后逐条代入子查询(这尼玛就是做了个交叉乘啊,有些弱智),最后导致sql查询异常慢。好吧,老老实实分步查吧。
然后分享一些索引优化的小知识:
1.联合索引有个最左匹配原则,即A+B+C组成一个索引,那么A或A+B或A+B+C的条件组合可以走索引,其他的都无法使用该索引。
2.如果sql只查询索引中包含的列,速度会快很多,因为此时数据库只需要从索引中取数据就够了,不需要要再扫表。像大数据量的分页查询就可以用这个思路进行优化。
3.查询条件的数据类型要准确,比如col1是字符型的,而你的sql写成select col... from tba where col1=11虽然也可以查出结果,但是这样是走不了col1上的索引的,需要写成where col1='11'这种形式才可以。
此外定期分析表和检查表说不定也有奇效,但是分析和检查表会锁表,最好在业务量较小的时候进行。
阅读全文
0 0
- MySQL优化---查询优化
- mysql优化之查询优化
- Mysql性能优化-查询优化
- MYSQL数据库查询优化
- MySQL查询优化技术讲座
- MySQL查询优化技术讲座
- MySQL查询优化程序
- MySQL查询优化技术讲座
- MySQL查询优化技术讲座
- 优化MySQL数据库查询
- MySQL查询优化-Admin
- 优化MySQL数据库查询
- 优化MySQL数据库查询
- MySQL查询优化程序
- MySQL查询优化技术讲座
- 优化MySQL数据库查询
- mysql查询优化方法
- MySQL 查询优化
- 使用Spring MVC统一异常处理实战
- python中改变字母大小写的函数upper()和lower()
- html5 调用手机相册并显示多图片
- windows——消息
- 常用系统函数
- MySQL查询优化
- 微信聊天机器人、Python、中文词云
- 数学中的各类曲线函数
- Java开发者写SQL时常犯的10个错误
- MYSQL 对null和空字符串正序排序靠前的解决方法
- js 锚点联动 回调渲染改变a标签 定位 滚动 导航
- 获取Enum枚举值描述的几法方法
- jsp简介
- HDU3371 Connect the Cities 题解 【图论】【最小生成树】