mysql使用嵌套循环连接的方式来实现所有表连接。这就意味着mysql首先读取第一个表的第一条匹配记录,然后找出第二个表中匹配的记录,再找出第三...第n个表中匹配的记录,直到所有的表找完。
mysql输出找到的字段,然后通过表列表回溯回去,直到表中存在多条匹配的记录,mysql继续从这个表中读如下一条记录,然后继续查找下一个表中匹配的记录,依次类推。
查询类型说明:
未完待续
mysql输出找到的字段,然后通过表列表回溯回去,直到表中存在多条匹配的记录,mysql继续从这个表中读如下一条记录,然后继续查找下一个表中匹配的记录,依次类推。
查询类型说明:
1.system:这种列席整个表只有一行记录,这种情况是const类型的特例。
2.const:这种类型表中最多只有一行数据与条件匹配,查询一开始就读取这个表的数据。因为只需要读取一次,所以const表查询速度非常快。
实例:
SELECT * FROMtbl_name
WHEREprimary_key
=1; SELECT * FROMtbl_name
WHEREprimary_key_part1
=1 ANDprimary_key_part2
=2;
3.eq_ref:这种类型对于前表中的每个连接行只需要读取一行记录。这种连接类型是除system,const外,最快的连接类型。
适用场景:
1)连接过程中能使用主键或非空唯一索引的全部列。
2)索引列用于相等(=)比较操作,比较值为常量或由读此表之前读取的表的字段组成的表达式。
实例:
SELECT * FROMref_table
,other_table
WHEREref_table
.key_column
=other_table
.column
; SELECT * FROMref_table
,other_table
WHEREref_table
.key_column_part1
=other_table
.column
ANDref_table
.key_column_part2
=1;
4.ref:这种类型表示从当前表中读取的所有行都匹配索引值,这些行与前表中的匹配并组合成新的行(combination of rows)。如果通过索引只匹配到少量行,则这种连接方式也是不错的。
适用场景:
1)使用普通索引的左前缀进行连接,同一个索引值能匹配多个行。
2)使用索引列进行=,<=>比较操作。
实例:
SELECT * FROM5. ref_or_null:这种连接类型与ref类似,但是这种连接中,mysql需要额外查找包含null值的行。这种连接优化最常用于解决子查询。ref_table
WHEREkey_column
=expr
; SELECT * FROMref_table
,other_table
WHEREref_table
.key_column
=other_table
.column
; SELECT * FROMref_table
,other_table
WHEREref_table
.key_column_part1
=other_table
.column
ANDref_table
.key_column_part2
=1;
实例:
SELECT * FROMref_table
WHEREkey_column
=expr
ORkey_column
IS NULL;
其它的连接类型:
fulltext:表示连接使用了全文索引。
未完待续