java面试一日一题:如何优化sql
问题:请讲下在mysql下如何优化sql
分析:该问题主要考察对mysql的优化,重点考虑对索引优化的掌握。
回答要点:
主要从以下几点去考虑,
1、什么样的sql需要优化?
2、怎么对sql进行优化?
3、如何避免索引失效?
要优化sql首先要判断哪些sql需要优化,然后是怎么优化,最后才是优化
开启慢查询
在mysql中慢查询是默认关闭的,在排查慢sql的时候建议开启慢查询,但在生产环境下不建议开启,因为会对性能造成影响;
explain
在上步中通过慢查询可以定位到慢sql,接着就可以使用explain关键字对慢sql进行分析,explain的作用就是给出sql的执行计划。
重点关注下面几列,id、type、possible_keys、key、extra
id代表执行的顺序,从大到小依次执行,id相同的情况从上到下执行
type代表连接使用了那种类别,是否使用了索引,从坏到好是all、index、range、ref、eq_ref、const、system。all是全表扫描;index使用索引;range表示范围查找;ref表示用到了非唯一索引;eq_ref表示使用唯一索引;const表示主键索引且是等值比较;system表示查询的系统表;
possible_keys代表可能用到的索引键
key代表实际用到的索引键
rows代表扫描的行数
extra代表除了已经显示的信息外同样重要的信息,常见的取值有using where using index usingfilesort usingtemporary。using where 表示使用了where条件;using index表示使用到了索引;usingfilesort表示使用到了文件排序,不是使用索引排序;usingtemporary表示用到了临时表,多用在order by/group by上
避免索引失效
索引在sql的优化方面占据了很大的比重,如何避免索引失效那
1、避免隐式的数据类型转换;例,where id=10 id为varchar类型,这时索引失效
2、在like中避免使用前缀%;例,where id like '%12',这时索引失效,如果让索引不失效,需要使用覆盖索引
3、避免在where条件中进行运算;例,where concat(id,'12')=12,这时索引失效
4、不符合索引匹配的最左原则的;多用在联合索引上,没使用到联合索引的第一个字段;
5、mysql使用分析器,分析出来的结果是全表扫描更快,这时也不会使用索引;
- 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程
- java面试一日一题:mysql事务是如何实现的
- 关于Java面试中sql优化的问题浅析
- Java开发面试:高并发秒杀系统如何设计与优化
- java面试之事务、sql优化
- 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程
- sql查询如何优化(干货,面试必备)
- Mysql优化技巧(数据库设计、命名规范、索引优化、面试、SQL面试,Java面试)
- 如何优化JAVA程序设计和编码,提高JAVA性能
- 面试问题 如何编写Java 代码使得Java虚拟机崩溃
- 从三个方面进行讲解如何适当优化"SQL"
- [MySQL优化] -- 如何定位效率较低的SQL
- 优化SQL查询:如何写出高性能SQL语句
- 如何优化JAVA程序开发,提高JAVA性能?
- 如何从优化SQL入手提高数据仓库的ETL效率
- 如何优化JAVA程序开发,提高JAVA性能
- [MySQL优化] -- 如何查找SQL效率地下的原因
- [MySQL优化] -- 如何查找SQL效率地下的原因
- 如何优化JAVA程序开发,提高JAVA性能?
- SQL优化34条 java面试题