java面试一日一题:如何优化sql

问题:请讲下在mysql下如何优化sqlmysql

分析:该问题主要考察对mysql的优化,重点考虑对索引优化的掌握。sql

回答要点:性能

主要从如下几点去考虑,优化

一、什么样的sql须要优化?排序

二、怎么对sql进行优化?索引

三、如何避免索引失效?file

 

要优化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的优化方面占据了很大的比重,如何避免索引失效那

一、避免隐式的数据类型转换;例,where id=10  id为varchar类型,这时索引失效

二、在like中避免使用前缀%;例,where id like '%12',这时索引失效,若是让索引不失效,须要使用覆盖索引

三、避免在where条件中进行运算;例,where concat(id,'12')=12,这时索引失效

四、不符合索引匹配的最左原则的;多用在联合索引上,没使用到联合索引的第一个字段;

五、mysql使用分析器,分析出来的结果是全表扫描更快,这时也不会使用索引;

相关文章
相关标签/搜索