问题:请讲下在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使用分析器,分析出来的结果是全表扫描更快,这时也不会使用索引;