• explain参数之type


    Type字段是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为:system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,all。

    (1)System

    表中只有一行数据或者空表,这是const类型的一个特例。且只能用于myisam和memory表。如果是innoDB引擎表,type列在这个情况下通常是all或者index。

    (2)Const

    最多只有一行记录匹配。当联合主键或唯一索引的所有字段跟常量值比较时,join类型为const。其他数据库也叫做唯一索引扫描。

    (3)Eq_ref

    多表join时,对于来自前面的每一张行,在当前表中只能找到一行。这可能是除了system和const之外最好的类型。当主键或唯一非null索引的所有字段都被用作join联接时会使用此类型。

    Eq_ref可用于使用“=”操作符比较的索引列。比较的值可以是常量,而ref使用的是非唯一索引或者普通索引。

    相对于ref的区别就是它使用的唯一索引,即主键或唯一索引,而ref使用的是非唯一索引或者普通索引。

    Eq_ref只能找到一行,而ref能够找到多行。

    (4)Ref

    对于来自前面表的每一行,在此表的索引中可以匹配到多行。若联接只用到索引的最左前缀或索引不是主键或唯一索引时,使用ref类型。也就是说,此联接能匹配到多行记录。Ref可用于使用“=”或‘<=>’操作符作比较的索引列。

    (5)Fulltext

    使用全文索引的时候就是这个类型。需要注意,全文索引的优先级很高,若全文索引和普通索引同时存在,MySQL不管代价,优先使用全文索引。

    (6)Ref_or_null

    和ref类型类似,只是增加了null值的比较,实际应用的不多。

    (7)Index_merge

    表示查询使用了两个以上的索引,最后取交集或者并集,常见and、or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取多个索引,性能可能大部分时间不如range。

    (8)Unique_subquery

    用于where中的in形式子查询,子查询返回不重复唯一值,可以完全替换子查询,效率更高。该类型替换了下面形式的in子查询的ref:value in (select primary key from single_table where some_expr)

    (9)Index_subquery

    该联接类型类似于unique_subquery,适用于非唯一索引,可以返回重复值。

    (10)Range

    索引范围查询,常见于使用=,<>,>=,<,<=,is null,between,in()或者like等运算符的查询中。

    (11)Index

    索引全表扫描,把索引从头到尾扫一遍,包含两种情况:

    一种是查询使用了覆盖索引,那么它只需要扫描索引就可以获取数据,这个效率要比全表扫描快,因为索引通常比数据表小,而且还能避免二次查询。在extra显示using index。反之,如果在索引上进行全表扫描,没有using index的提示。

    (12)all

    全表扫描,性能最差。

    欢迎批评指正,提出问题,谢谢!
  • 相关阅读:
    ssh配置调试的必杀技
    关于lua垃圾回收是否会执行__gc函数呢?
    lua技巧分享之保护执行
    Java访问Hbase
    详解mmseg
    相关query挖掘
    玩转游戏搜索
    JVM系列-常用参数
    Java批处理ExecutorService/CompletionService
    Java动态编译
  • 原文地址:https://www.cnblogs.com/xxeleanor/p/14995330.html
Copyright © 2020-2023  润新知