开篇吐槽
说起MySQL的性能优化,相信大家在面试中都经历过,网友这样回答:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型等等。这么回答你以为就能得到面试官的芳心吗?刚毕业的学生都会这样回答了,但是这样回答前两年,可能你还会拿到offer,但是伴随今年的寒冬时期,你就需要更加用心的去回答,比如加上一点示例,实际应用等等。
简单回答那些技巧,面试官肯定会追问下去:是否理解其背后的工作原理?在实际场景下有用到过吗?性能提升了吗?可能大家都呵呵哒了。
我们有句古话:纸上得来终觉浅,须知此事要躬行。
因而理解这些优化建议背后的原理并且付诸于行动就显得尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下得到合理的运用。
性能优化
吐槽了那么多,下面我们具体从几个方面讲下SQL的性能优化建议。
1.Scheme设计与数据类型优化
选择数据类型只要遵循小而简单的原则就好,越小的数据类型通常会更快,占用更少的磁盘、内存,处理时需要的CPU周期也更少。
越简单的数据类型在计算时需要更少的CPU周期,比如,整型就比字符操作代价低,因而会使用整型来存储ip地址,使用DATETIME来存储时间,而不是使用字符串。
2.创建高性能索引
索引是提高MySQL查询性能的一个重要途径,但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用,从而影响应用程序的整体性能。应当尽量避免事后才想起添加索引,因为事后可能需要监控大量的SQL才能定位到问题所在,而且添加索引的时间肯定是远大于初始添加索引所需要的时间,可见索引的添加也是非常有技术含量的。
在设计索引时,如果一个索引既能够满足排序,又满足查询,是最好的。
创建索引需要注意的技巧:
- 索引创建要覆盖查询条件
- 使用索引扫描来排序
- 删除长期未使用的索引
- 索引在like里面的使用注意事项
- 对于使用like的查询,查询如果是 ‘%aaa’ 不会使用到索引,‘aaa%’ 会使用到索引。
3.建表永远要留一个ID主键
同时建表也要注意遵守以下几个范式
4.分析查询日志和慢查询日志
记录全部查询。这在用 ORM 系统或者生成查询语句的系统非常实用。
log=/var/log/mysql.log
注意千万不要在生产环境用。否则日志会占满你的磁盘空间。后果不堪设想。
记录运行时间超过 2秒的查询:
long_query_time=2
log-slow-queries=/var/log/mysql/log-slow-queries.log
后面还有很多很多我们不再详说,都是很简洁明了的,比如:
- 尽量不要使用NOT IN和<>操作
- 尽量避免Select * 命令
- 尽量不要使用BY RAND()命令
- 尽量少排序
- 尽量少OR
写在文末
理解查询是如何执行以及时间具体都消耗在哪些地方,细化到哪条SQL,再加上一些优化过程的知识,可以帮助大家更好的理解MySQL,理解常见优化技巧背后的原理。
最后衷心希望本文中的一些小技巧能够帮助大家更好的将理论和实践结合起来,更多的将理论知识应用到实践中,提高自己项目的SQL性能。
发文不易,可否给个赞?谢谢各位同学~~~