背景

在当今这个互联网的时代无非要解决两大难题,其一是信息安全,其二就是数据的存储。而信息安全则是在数据存储的基础之上。一个公司从刚开始成立到发展成一个有上百人甚至上千人团队的时候,公司的业务量是呈上升趋势,客户及用户也会越来越多;之前设计的表结构可能会显得不合理,表与表之间的联系没有一个稳定的业务功能划分,从而表现出来的是相关表的备用字段越来越不够用甚至新加字段,最坏的情况就是不同业务表之间会有数据冗杂。从而暴露出一些设计的问题,这也就是SQL优化点之一:数据库表结构设计的合理性。近年来大数据越来越火,而大数据也是为了解决数据的存储的手段之一,其目的是从海量的数据中收集到有价值的信息然后存储到数据库中,因为数据量大传统的数据库无法储存那么多的信息所以需要分析有价值的信息后再做决定是否持久化。

优化点

前提必备知识

学会是用explain关键词查看SQL语句性能,explain好像是从MYSQL5.6.3开始支持 select、update、delete语句分析,之前只支持select语句。现在我们普遍都是用5.7,所以的话不需要太担心。这里的话不详细讲如何解读explain输出的性能信息。

优化之一 - 从数据库设计方面考虑

  • 表与表之间的业务联系要明确:表之间其实是有业务联系的,比如:class(primary key:class_id,所有班级信息表)、student(primary key:student_num,所有学生信息表)、student_class(primary key:stu_class_id,所有学生所在班级信息表)着三张表,如果现在需要一张老师对应哪个班级的班主任的信息表;那么此时正确的方法是:新建 teacher、teacher_class表,而不是直接把老师的信息插入到student表中然后用一个字段来标识是老师还是学生。可能你看到这个你会想 “我肯定会按正确的那种方式啊”,但是这只是举一个例子,其实在实际项目开发过程中表与表结构往往不会那么单一,这个时候你就会犯错误而用字段标识。但是也不能说是不能用字段标识,这个要看字段标识的两种信息对应的业务是否有交叉点来取舍。

  • 表字段尽量使用数值型:因为数值型字段在MySQL底层应用的时候相比string类型的话性能更好;具体为什么性能更好就需要了解MySQL底层机制了,反正记住这点就好。

  • 属性尽量使用定长:以减少占用储存空间;如果你定义了一个 order_id varchar(32) ,当在存储的时候有一条记录的order_id=20180910242360,此时order_id实际占用了14个字节但是这个字段的属性长度是32,所以还有18个字节长度是无用的但却占用着内存空间。

  • 建立合理的索引:索引就是用某种数据结构来查找对应的信息,从而减低时间复杂度提高查找效率。建立索引的前提也要明确,综合考虑再打算是否需要建立索引,毕竟索引是需要占用存储空间的,有时候牺牲的空间却换不回时间。

优化之二 - 从SQL语句优化方面考虑

1. 尽量将要输出的字段写出来;不要使用 select * from where xxxxx ;这种形式的语句。我在这测试时是使用*代替,但是记住在生产环境上尽量将字段替代*。

2. 合理使用连表查询;不仅是表的连接需要较大的内存消耗另外一方面如果表设计的不是很合理也会导致索引无效从而造成极坏的结果。

3. 查询的时候要注意是否走索引:假如你在name列建立了一个 name_index索引,查询你使用 name Like'%xxxx' 或者 name Like'%xxxx%' 这种模糊查询,那么此时可能就不会走索引;你应该这样  name Like'xxxx%' 。以下就是实际的一个例子:  

建立索引:

-- 为cust_third_acct 建立一个普通索引alter tablecust_infoadd index cust_third_acct_index(cust_third_acct);
  1. 通过SQL查询信息: select * from sp_tunnel_user where cust_third_acct like'0200%';   以下就是满足查询条件的部分信息

  2. 分析Like'%xxxx%'的查询性能: select * from sp_tunnel_user where cust_third_acct like'%0200%';  通过Explain性能分析命令可以知道:在这种查询条件下并没有执行索引,type=all表明该语句执行的时候进行的是全表扫描;虽然我们在 cust_third_acct  这个字段建立了索引,但是 possible_keys=null 则说明了 用 like'%0200%' 这种形式的条件是一定无法使用到  cust_third_acct_index  这个索引。

  3. 分析Like'xxxx%'的查询性能: select * from sp_tunnel_user where cust_third_acct like'0200%';  与b查询语句相比这个查询的  possible_keys=cust_third_acct_index  ,这说明这个语句可能会用到 cust_third_acct_index 这个索引,但是key=null表明在实际的执行过程中并没有用到  cust_third_acct_index  索引;刚才我们也说了这种条件查询只是可能会走索引但是不一定发生,这个跟MySQL的存储引擎相关,但是我们使用的时候尽量以这种方式去查询。

4. 使用索引遵循最佳左前缀特性,建立联合索引的时候将常用的属性放在左边。比如:我们需在在一张表的 cust_id 和 cust_tp 建立一个联合索引 cust_id_type,设定cust_id(不是唯一) 是比较常用的那么我们就将cust_id放在左边。

建立联合索引:

-- 为cust_id与cust_tp建立一个联合索引alter tablecust_infoadd index  cust_id_type(cust_id,cust_tp);

5.使用符合索引的时候需要注意:使用联合索引需要从左往右不间断,索引才会生效,也就是说联合索引使用的时候必须要连续但不要求全部使用。如:以上4我们建立了一个  cust_id_type  索引,当我们在使用的时候如果where条件中只使用了 cust_id,那么也会走索引;如果where条件中只使用了 cust_tp,那么这条语句不会走索引,以下就是一个实例:

  1. select * from sp_tunnel_user where cust_id='8888888888' and cust_tp='04';  当查询条件用到cust_id与cust_tp两个字段并且cust_id在前面的时候,就会用到联合索引;通过 key=cust_id_type可以看到实际执行过程中是用到索引了的。

  2. select * from sp_tunnel_user where cust_id='8888888888' ;  当查询条件只用到cust_id一个字段时,也用到了联合索引;通过 key=cust_id_type可以看到实际执行过程中是用到索引了的,这就是左前缀原则。

  3. select * from sp_tunnel_user where cust_tp='04' ;  当查询条件只用到cust_tp一个字段时,但却没有用到索引;通过 key=null 可以看到实际执行过程并没有用到索引,这也是左前缀原则。

优化之三 - 读写分离与分库分表

当数据量达到一定的数量之后,限制数据库存储性能的就不再是数据库层面的优化就能够解决的;这个时候往往采用的是读写分离与分库分表同时也会结合缓存一起使用,而这个时候数据库层面的优化只是基础。读写分离适用于较小一些的数据量;分表适用于中等数据量;而分库与分表一般是结合着用,这就适用于大数据量的存储了,这也是现在大型互联网公司解决数据存储的方法之一。至于怎么读写分离、怎么分表、怎么分库,这里不做过多的阐述后续文章会有相关知识分享。

原文出处:https://www.cnblogs.com/wind-june/p/9638356.html

关于SQL优化这些你了解吗?相关推荐

  1. 史上最全SQL优化方案(二)

    接上篇!! 4 基础优化 a 优化思路 定位问题点吮吸:硬件–>系统–>应用–>数据库–>架构(高可用.读写分离.分库分表). 处理方向:明确优化目标.性能和安全的折中.防患未 ...

  2. 中秋节,送上一次非常有趣的SQL优化实战经历

    点击上方"搜云库技术团队",选择"设为星标" 回复"1024"或"面试题"获取4T学习资料 补充:看到好多朋友后台留言说 ...

  3. MySQL进阶SQL优化

    MySQL进阶SQL优化 查询效率分析: 子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询.在这种情况下可以考虑用联接查询来取代. 如果要用子查询,那就用EXISTS替代IN.用NOT ...

  4. [转]Mysql中的SQL优化与执行计划

    From : http://religiose.iteye.com/blog/1685537 一,如何判断SQL的执行效率? 通过explain 关键字分析效率低的SQL执行计划. 比如: expla ...

  5. MySQL优化篇:SQL优化流程

    MySQL中SQL优化流程 SQL优化流程如下: 慢查询的开启并捕获 explain+慢SQL分析 show profile查询SQL在MySQL服务器里面的执行细节和生命周期情况 SQL数据库服务器 ...

  6. 5大步骤+10个案例,堪称SQL优化万能公式

    作者丨狼爷 来源丨网址:https://www.cnblogs.com/powercto/p/14410128.html 一.前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随 ...

  7. 15 种 SQL 优化中,老司机才懂的处理技巧

    前言 SQL优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到. 如果某天你负责的某个线上接口,出现了性能问题,需要做优化.那么你首先想到的很有可能是优化SQL语句,因为它 ...

  8. 面试官:不会看 Explain执行计划,简历敢写 SQL 优化?

    来自:程序员内点事 昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴. 聊着聊着突然说到他上午面试了一 ...

  9. 大牛是怎么思考设计SQL优化方案的?

    作者:惨绿少年 https://www.cnblogs.com/clsn/p/8214048.html 在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循 ...

  10. MySQL · 性能优化· CloudDBA SQL优化建议之统计信息获取

    阿里云CloudDBA具有SQL优化建议功能,包括SQL重写建议和索引建议.SQL索引建议是帮助数据库优化器创造最佳执行路径,需要遵循数据库优化器的一系列规则来实现.CloudDBA需要首先计算表统计 ...

最新文章

  1. 关于WM_NCHITTEST消息(移动无标题对话框多个)
  2. [恢]hdu 200题留念
  3. 实时操作系统与通用计算机操作系统的区别,实时操作系统(RTOS)和通用操作系统(OS)之间的区别...
  4. java jar包 平滑重启,nginx 平滑重启的实现方法
  5. apache hive_通过6个简单的步骤在Windows上运行Apache Hive
  6. JBoss Forge NetBeans集成–入门
  7. 一图读懂马云与阿里20年:互联网巨头是如何养成的?
  8. 特征描述子(feature descriptor) —— HOG(方向梯度直方图)
  9. 京东联盟新版API接口PHP版SDK的坑
  10. 强化学习(实践):多臂老虎机,动态规划,时序差分
  11. oracle存储过程if的使用,oracle存储过程if语句
  12. 【学生管理系统】用户管理之用户登录
  13. 国际物流专线是什么意思?
  14. Python下Spyder安装方法
  15. 简述封装vue组件的过程
  16. Apache service named reported the following error(OS 10055)由于系统缓冲区空间不足或队列已满解决办法?...
  17. 网站登录入口大全|搜索引擎登录入口
  18. Android读取手机ROM总大小方法
  19. 许多博士生(人)的一个通病:对导师过度依赖!
  20. 【一起来刷Python题】——16.进制转换器

热门文章

  1. halcon找矩形顶点的一种方法
  2. create_metrology_model创建测量几何形状所需的数据结构(原理)
  3. python异步_Python通过Thread实现异步
  4. python idle 清屏问题的解决
  5. python迭代器使用_python迭代器的使用方法实例
  6. CH0805 防线 (二分值域,前缀和,特殊性质)
  7. 洛谷 题解 P2312 【解方程】
  8. 最近和朋友微信卖螃蟹有点偏离重心了
  9. hdu.1430.魔板(bfs + 康托展开)
  10. 10. javacript高级程序设计-DOM