zoukankan      html  css  js  c++  java
  • 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使用分析器,分析出来的结果是全表扫描更快,这时也不会使用索引;

    一个爱写文章的程序员,欢迎关注我的公众号“北漂程序员”。我有故事,你有酒吗
  • 相关阅读:
    Ackerman 函数奇怪的函数
    HDU2871 Memory Control 线段树区间合并
    HDU3667 Hotel 线段树 经典空间合并
    图论
    HDU3016 Man Down 线段树
    HDU1878 欧拉回路 判定是否存在欧拉回路
    从今开始
    如何打开注册表编辑器
    ASP.NET中TextBox控件设置ReadOnly="true"后台取不到值
    学习笔记(2011年5月到9月)
  • 原文地址:https://www.cnblogs.com/teach/p/14651041.html
Copyright © 2011-2022 走看看