mysql 执行计划type类型及sql优化原则介绍

来源:互联网 发布:国外买淘宝 编辑:程序博客网 时间:2024/05/20 05:57
type
    连接类型
    system          表只有一行
    const            表最多只有一行匹配,通用用于主键或者唯一索引比较时。如将主键置于where列表中,MySQL就能将该查询转换为一个常量
    eq_ref          每次与之前的表合并行都只在该表读取一行,这是除了system,const之外最好的一种,特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引
    ref               如果每次只匹配少数行,那就是比较好的一种,使用=或<=>,可以是左覆盖索引或非主键或非唯一键
    fulltext        全文搜索
    ref_or_null 与ref类似,但包括NULL
    index_merge     表示出现了索引合并优化(包括交集,并集以及交集之间的并集),但不包括跨表和全文索引。 这个比较复杂,目前的理解是合并单表的范围索引扫描(如果成本估算比普通的range要更优的话)
    unique_subquery 在in子查询中,就是value in (select...)把形如“select unique_key_column”的子查询替换。PS:所以不一定in子句中使用子查询就是低效的!
    index_subquery  同上,但把形如”select non_unique_key_column“的子查询替换
    range           常数值的范围(索引范围扫描),对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
    index           a.当查询是索引覆盖的,即所有数据均可从索引树获取的时候(Extra中有UsingIndex);
                        b.以索引顺序从索引中查找数据行的全表扫描(无 UsingIndex);
                       c.如果Extra中Using IndexUsing Where同时出现的话,则是利用索引查找键值的意思;
                       d.如单独出现,则是用读索引来代替读行,但不用于查找
    all              遍历全表以找到匹配的行
    null:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引

果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL


sql优化原则:
禁用select *使用select count(*) 统计行数尽量少运算尽量避免全表扫描,如果可以,在过滤列建立索引尽量避免在where子句对字段进行null判断尽量避免在where子句使用!= 或者<>尽量避免在where子句使用or连接尽量避免对字段进行表达式计算尽量避免对字段进行函数操作尽量避免使用不是复合索引的前缀列进行过滤连接尽量少排序,如果可以,建立索引尽量少join尽量用join代替子查询尽量避免在where子句中使用in,not in或者having,使用exists,not exists代替尽量避免两端模糊匹配 like %***%尽量用union all代替union尽量早过滤避免类型转换尽量批量insert优先优化高并发sql,而不是频率低的大sql尽可能对每一条sql进行explain尽可能从全局出发

转载:http://blog.csdn.net/leshami/article/details/49447543
原创粉丝点击