MySQL性能优化实践( 三 )

  • union:若第二个 select 出现在 union 之后,则被标记为该值 。若 union 包含在 from 的子查询中,外层 select 被标记为 derived
  • union result:从 union 表获取结果的 select
  • 3) table:显示该行数据是关于哪张表
    4) partitions:匹配的分区
    5) type:表的连接类型,其值,性能由高到底排列如下:
    • system:表只有一行记录,相当于系统表
    • const:通过索引一次就找到,只匹配一行数据
    • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配 。常用于主键或唯一索引扫描
    • ref:非唯一性索引扫描,返回匹配某个单独值的所有行 。用于=、< 或 > 操作符带索引的列
    • range:只检索给定范围的行,使用一个索引来选择行 。一般使用between、>、<情况
    • index:只遍历索引树
    • ALL:全表扫描,性能最差
    注:前5种情况都是理想情况的索引使用情况 。通常优化至少到range级别,最好能优化到 ref
    6) possible_keys:指出 MySQL 使用哪个索引在该表找到行记录 。如果该值为 NULL,说明没有使用索引,可以建立索引提高性能
    7) key:显示 MySQL 实际使用的索引 。如果为 NULL,则没有使用索引查询
    8) key_len:表示索引中使用的字节数,通过该列计算查询中使用的索引的长度 。在不损失精确性的情况下,长度越短越好 显示的是索引字段的最大长度,并非实际使用长度
    9) ref:显示该表的索引字段关联了哪张表的哪个字段
    10) rows:根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好
    11) filtered:返回结果的行数占读取行数的百分比,值越大越好
    12) extra:包含不合适在其他列中显示但十分重要的额外信息,常见的值如下:
    • using filesort:说明 MySQL 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取 。出现该值,应该优化 SQL
    • using temporary:使用了临时表保存中间结果,MySQL 在对查询结果排序时使用临时表 。常见于排序 order by 和分组查询 group by 。出现该值,应该优化 SQL
    • using index:表示相应的 select 操作使用了覆盖索引,避免了访问表的数据行,效率不错
    • using where:where 子句用于限制哪一行
    • using join buffer:使用连接缓存
    • distinct:发现第一个匹配后,停止为当前的行组合搜索更多的行
    注意:出现前 2 个值,SQL 语句必须要优化 。
    5.2 方式二:profiling使用 profiling 命令可以了解 SQL 语句消耗资源的详细信息(每个执行步骤的开销) 。
    5.2.1 查看 profile 开启情况select @@profiling;返回结果:
    mysql> select @@profiling;+-------------+| @@profiling |+-------------+|           0 |+-------------+1 row in set, 1 warning (0.00 sec)0 表示关闭状态,1 表示开启
    5.2.2 启用 profileset profiling = 1;  返回结果:
    mysql> set profiling = 1;  Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select @@profiling;+-------------+| @@profiling |+-------------+|           1 |+-------------+1 row in set, 1 warning (0.00 sec)在连接关闭后,profiling 状态自动设置为关闭状态 。
    5.2.3 查看执行的 SQL 列表show profiles;返回结果:
    mysql> show profiles;+----------+------------+------------------------------+| Query_ID | Duration   | Query                        |+----------+------------+------------------------------+|        1 | 0.00062925 | select @@profiling           ||        2 | 0.00094150 | show tables                  ||        3 | 0.00119125 | show databases               ||        4 | 0.00029750 | SELECT DATABASE()            ||        5 | 0.00025975 | show databases               ||        6 | 0.00023050 | show tables                  ||        7 | 0.00042000 | show tables                  ||        8 | 0.00260675 | desc role                    ||        9 | 0.00074900 | select name,is_key from role |+----------+------------+------------------------------+9 rows in set, 1 warning (0.00 sec)


    推荐阅读