mysql优化篇(基于索引)( 三 )

  • ALL:对于前面的表的任意行组合进行完整的表扫描
  • system>const>eq_ref>ref>index>ALL(这些比较常见 , )
  • 6、possible_keys:指出MySQL能使用哪个索引在该表中找到行 。 若该列是NULL , 则没有相关的索引 。 在这种情况下 , 可以通过检查WHERE子句看它是否引用某些列或适合索引的列来提高查询性能 。 如果是这样 , 可以创建适合的索引来提高查询的性能 。
    7、kye:表示查询实际使用的索引 , 如果没有选择索引 , 该列的值是NULL 。 要想强制MySQL使用或忽视possible_keys列中的索引 , 在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX
    8、key_len:表示MySQL选择的索引字段按字节计算的长度 , 若键是NULL , 则长度为NULL 。 注意 , 通过key_len值可以确定MySQL将实际使用一个多列索引中的几个字段
    9、ref:表示使用哪个列或常数与索引一起来查询记录 。
    10、rows:显示MySQL在表中进行查询时必须检查的行数 。
    11、filtered:按表条件筛选的行的百分比
    12、Extra:表示MySQL在处理查询时的详细信息
    • using filesort: 使用了文件排序 , 很影响性能
    • using temporary: 使用了临时表 , 很影响性能
    • using index: 使用了覆盖索引
    • using where: 使用了where
    • using MRR: 使用了MRR优化
    • using join buffer: 使用了链接缓存
    • impossible where: where的条件总是false
    • select tbles optimized away: 在没有group by操作的情况下 , 不必等到执行阶段再计算
    • distnct: 优化distinct操作
    • using index condition: 使用了ICP优化
    更多详情见官网:
    回到顶部
    2.2.2、show profileShow Profile是mysql提供的可以用来分析当前会话中sql语句执行的资源消耗情况的工具 , 可用于sql调优的测量 。 默认情况下处于关闭状态 , 并保存最近15次的运行结果 。
    mysql优化篇(基于索引)文章插图
    SHOW PROFILE [type [, type] ... ][FOR QUERY n][LIMIT row_count [OFFSET offset]]type: {ALL#显示所有的开销信息| BLOCK IO #显示块IO开销| CONTEXT SWITCHES #上下文切换开销| CPU #显示CPU开销信息| IPC #显示发送和接收开销信息| MEMORY #显示内存开销信息| PAGE FAULTS #显示页面错误开销信息| SOURCE #显示和Source_function , Source_file , Source_line相关的开销信息| SWAPS #显示交换次数开销信息}
    mysql优化篇(基于索引)文章插图
    show variables like '%profiling%';
    mysql优化篇(基于索引)文章插图
    set global profiling =on;
    mysql优化篇(基于索引)文章插图
    然后我们随性的多执行一些查询语句 , 在通过show profiles查看:
    mysql优化篇(基于索引)文章插图
    上面有3列 , 一个是查询的id , 一个是执行的时间 , 最后一个是执行语句 。
    然后我们对id=8的语句进行诊断:show profile cpu,block io for query Query_ID;/*Query_ID为#3步骤中show profiles列表中的Query_ID*/
    mysql优化篇(基于索引)文章插图
    上表中第一列为该sql查询的状态 , 也是sql的一个生命周期 , 从开始 , 到权限 , 打开表 , 初始化 , 上锁 , 优化 , 统计 , 执行 , 发送数据 , 查询结束 , 关闭表等 。
    在状态这一列中要注意一些点:
    • converting HEAP to MyISAM:查询结果太大 , 内存不够 , 数据往磁盘上搬了 。
    • Creating tmp table:创建临时表 。 先拷贝数据到临时表 , 用完后再删除临时表 。
    • Copying to tmp table on disk:把内存中临时表复制到磁盘上 ,
    从上看来主要的时间花在了数据的传输上面 , 所以可以针对该项进行优化 , 更多详情见官网:
    回到顶部
    三、优化具体点3.1、sql的执行顺序在去写好sql和优化sql查询之前 , 知道sql的执行顺序尤为的重要(所以这里要多读几遍)
    from ->on ->join ->where ->group by ->having ->select ->distinct ->order by ->limit 1、from 对查询指定的表计算笛卡尔积2、on 按照 join_condition 过滤数据3、join 添加关联外部表数据4、where 按照where_condition过滤数据5、group by 进行分组操作6、having 按照having_condition过滤数据7、select 选择指定的列8、distinct 指定列去重9、order by 按照order_by_condition排序10、limit 取出指定记录量
    3.2、创建索引和不该创建索引时机应该创建索引