索引是一个单独的,存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一定特定值的行。
MySql中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关。MyISAM和InnoDB引擎只支持BTREE索引。MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
未使用索引之前,一条sql查询过程:
mysql> explain select * from user where name='小王' \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 7
filtered: 14.29
Extra: Using where
1 row in set, 1 warning (0.00 sec)
explain各行解释:
id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
select_type: SELECT 查询的类型.,这里为SIMPLE,表示为简单的查询,不使用UNION或者子查询
table: 查询的是哪个表,按读取的先后顺序排列
partitions: 匹配的分区
type: 指定了本数据表与其他数据表之间的关联关系。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
possible_keys: 此次查询中可能选用的索引
key: 此次查询中确切使用到的索引.
key_len::使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref: :显示索引的哪一列被使用了,如果可能的话,是一个常数
rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
filtered: 表示此查询条件所过滤的数据的百分比
extra: 额外的信息
当在表name列加一个索引时
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref
possible_keys: sy_name
key: sy_name
key_len: 767
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.06 sec)
ERROR:
rows: 显示此查询一共扫描了多少行. 这次就扫描的一行,不加索引时,全部扫描一遍。