MySQL Explain输出详解和总结

mysql使用嵌套循环连接的方式来实现所有表连接。这就意味着mysql首先读取第一个表的第一条匹配记录,然后找出第二个表中匹配的记录,再找出第三...第n个表中匹配的记录,直到所有的表找完。
mysql输出找到的字段,然后通过表列表回溯回去,直到表中存在多条匹配的记录,mysql继续从这个表中读如下一条记录,然后继续查找下一个表中匹配的记录,依次类推。


查询类型说明:

1.system:这种列席整个表只有一行记录,这种情况是const类型的特例。


2.const:这种类型表中最多只有一行数据与条件匹配,查询一开始就读取这个表的数据。因为只需要读取一次,所以const表查询速度非常快。

实例:

SELECT * FROM tbl_name WHERE primary_key=1;

SELECT * FROM tbl_name
  WHERE primary_key_part1=1 AND primary_key_part2=2;


3.eq_ref:这种类型对于前表中的每个连接行只需要读取一行记录。这种连接类型是除system,const外,最快的连接类型。

适用场景:

    1)连接过程中能使用主键或非空唯一索引的全部列。

    2)索引列用于相等(=)比较操作,比较值为常量或由读此表之前读取的表的字段组成的表达式。

实例:

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column_part1=other_table.column
  AND ref_table.key_column_part2=1;


4.ref:这种类型表示从当前表中读取的所有行都匹配索引值,这些行与前表中的匹配并组合成新的行(combination of rows)。如果通过索引只匹配到少量行,则这种连接方式也是不错的。

适用场景:

    1)使用普通索引的左前缀进行连接,同一个索引值能匹配多个行。

    2)使用索引列进行=,<=>比较操作。

实例:

SELECT * FROM ref_table WHERE key_column=expr;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column_part1=other_table.column
  AND ref_table.key_column_part2=1;
5. ref_or_null:这种连接类型与ref类似,但是这种连接中,mysql需要额外查找包含null值的行。这种连接优化最常用于解决子查询。

实例:

SELECT * FROM ref_table
  WHERE key_column=expr OR key_column IS NULL;



其它的连接类型:

fulltext:表示连接使用了全文索引。




未完待续
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值