sql优化之终极方案
目录
使用索引注意事项
order by 优化
group by 优化
延迟关联
关联查询
in和exist优化
count(*)查询优化
聚族索引和辅助索引
分表分库
下面总结了在项目中常用到的sql优化方案,在对sql优化的时候可能用得到。
使用索引注意事项
全值匹配"*"慎用;
遵循最佳左前缀法则,比如在建立联合索引时;
不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描;
联合索引中使用范围条件(范围之后全失效,不包括本身);
尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少select *语句;
mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫;
is null,is not null 也无法使用索引;
like以通配符开头('$abc...')mysql索引失效会变成全表扫描操作;
字符串不加单引号索引失效;
少用or,用它连接时很多情况下索引会失效;
数据库字符集不一致也会导致索引失效;
数据库查询字段类型和建立索引类型不同会导致索引失效;
在建立联合索引时,尽量保证索引的唯一性,这样数据的离散性更好,定位数据更快;
通过Explain和使用optimizer_trace 分析sql的索引效率,后面会有文章单独分析;
order by 优化
Mysql排序支持两种filesort和index
- 这种方式在使用explain分析时显示为using index,不需要额外的排序, 是指mysql扫描索引本身完成排序,操作效率较高;
- 通过对返回数据进行排序,即filesort,所有不通过索引直接返回排序结果的排序都是filesort排序。
单路、双路排序:
单路排序会将整行所有数据缓存到sort buffer中;
双路排序只将主键id和排序字段放入到sort buffer中排序,在根据排序好的数据,从原来表中根据id查询数据返回给客户端;
group by 优化
- group by 没有排序要求,可以在最后加上 order by null 避免不必要的排序;
- group by的字段尽量覆盖索引,避免文件排序带来的性能损;
- 如果 group by 需要统计的数据量不大,尽量只使用内存临时表;也可以通过适当调大 tmp_table_size 参数,来避免用到磁盘临时表;
- 如果数据量实在太大,使用 SQL_BIG_RESULT 这个提示,来告诉优化器直接使用排序算法得到 group by 的结果。
延迟关联
先查询索引列id
关联查询
在使用Join 进行关联查询的时候最多关联3张表,并且在使用Left join/ right join注意驱动表顺序,小表驱动大表;
在关联查询会使用到下面关联查询算法:
Nested-Loop Join 嵌套循环连接 算法(主键关联查询)
Block Nested-Loop Join 基于块的嵌套循环连接 算法(非索引关联查询)
有索引的情况下 NLJ 算法比 BNL算法性能更高
in和exist优化
原则:小表驱动大表,即小的数据集驱动大的数据集
count(*)查询优化
1.count(field)不包含字段值为NULL的记录。
2.count(*)包含NULL记录。
3.select count(*)与select count(1) 在InnoDB中性能没有任何区别,处理方式相同。
常见优化方案:
- 对于myisam存储引擎的表做不带where条件的count查询性能是很高的,因为myisam存储引擎的表的总行数会被mysql存储在磁盘上,查询不需要计算
- show table status
- 使用Redis set key记录表总数
聚族索引和辅助索引
主键索引就是聚族索引,普通索引就是辅助索引;
只查询主键时,直接走主键索引获取数据;查询其他字段需要先走辅助索引,然后获取到聚族索引地址,然后在根据主键地址获取到其他字段值。
所以查询字段尽量全覆盖到索引避免回表查询;
分表分库
在数据量大于500w或者存储数据大于2G时通过shading jdbc组件进行分表、分库;
对于大数据量还可以采用数据异构系统、搜索引擎、大数据等解决方案。
sql优化之终极方案相关推荐
- mysql和mybatis优化_MySQL + mybatis的SQL优化方案
sql优化方案: 1.添加索引,在条件参数,关联参数上建立参数, 2.字段优化,需要什么字段查什么字段 3.模糊查询尽量使用: select * from tableName a where a.na ...
- mybatis与mysql调优_MySQL + mybatis的SQL优化方案
sql优化方案: 1.添加索引,在条件参数,关联参数上建立参数, 2.字段优化,需要什么字段查什么字段 3.模糊查询尽量使用: select * from tableName a where a.na ...
- 容易忽视的十大SQL优化方案!
SQL性能问题已经逐步发展成为数据库性能的首要问题,80%的数据库性能问题都是因SQL而导致.面对日益增多的SQL性能问题,如何下手以及如何提前审核已经成为越来越多的程序员必须要考虑的问题.小千总结了 ...
- 史上最全SQL优化方案(二)
接上篇!! 4 基础优化 a 优化思路 定位问题点吮吸:硬件–>系统–>应用–>数据库–>架构(高可用.读写分离.分库分表). 处理方向:明确优化目标.性能和安全的折中.防患未 ...
- 大牛是怎么思考设计SQL优化方案的?
作者:惨绿少年 https://www.cnblogs.com/clsn/p/8214048.html 在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循 ...
- 数据库 SQL 优化大总结之:百万级数据库优化方案
网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...
- 史上最全SQL优化方案
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 作者 ...
- 数据库SQL优化大总结之 百万级数据库优化方案(转载)
原文地址:http://www.cnblogs.com/yunfeifei/p/3850440.html 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错 ...
- 史上最全的 SQL 优化方案!建议收藏
在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行已. 图-MySQL查询过程 1 优化的哲学 注 ...
- 最全的 SQL 优化方案
转自:https://www.cnblogs.com/clsn/p/8214048.html 1.1 前言 在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是 ...
最新文章
- 全国计算机建模三等奖,2009年全国数学建模真题(论文获国家 三等奖).doc
- 数据结构学习笔记4.1--查找节点
- 使用VirtualAlloc在0x400000处申请内存
- unity 3d物体描边效果_从零开始的卡通渲染描边篇
- map的extract 是更换 map 的键而不重分配的唯一方式:
- python决策树 value_机器学习 | 算法笔记(四)- 决策树算法以及代码实现
- TestNG参数化测试
- Windows 7 时代即将终结!
- grunt + compass
- php file取不到手机相册,webuploader移动端选择文件无法打开手机相册的解决办法...
- python b站自动签到_B站自动操作脚本(投币点赞分享视频,直播签到,获取银瓜子,自动转发抽奖,漫画APP签到)...
- flutter,快速获取ios设备的udid
- dirver时区_时区问题
- WAP中利用截取手机号码达到自动登入的一段源码(转)
- vm文件,.vm后缀的文件
- response中setContentType、setCharacterEncoding和setHeader方法的解释
- java代码怎么打印松树_用JAVA画一颗树(Applet)
- unity shader 实现Ps的 19号笔刷厚涂阴影效果
- X3850 X5安装ESXI6.0U3需要手动加载LPe11000驱动
- 视频播放ExoPlayer(附小demo)
热门文章
- Source Insight 4.0安装破解及简单使用
- 亲测有效win10系统QQ音乐无法安装
- 状态栏RAT信号图标显示
- 用电视上网——网络电视机顶盒
- 腾讯是如何一刀刀,在15年间干死那些竞争对手的?
- 【ArcGIS】Packaging succeeded,but publishing failed ERROR001487
- GitHub clone: clone succeeded, but checked failed
- C语言实现哈夫曼压缩与解压缩的实现以及读取哈夫曼编码 万文长书,绝对详细哦
- 三大跳槽传闻,信了你就输了!
- 鲶鱼效应 互联网倒逼传统金融业转型