四、使用explain查询,查看索引使用状况(这里还能够进行屡次其余sql语句的查询,查看索引利用状况)mysql
从上面能够看到key_len使用的长度为38(字节),那么总的索引长度是多少呢?sql
下面继续对表的建立进行查看,查看各个字段的大小spa
其中:.net
latin1 = 1 byte = 1 character
uft8 = 3 byte = 1 character
gbk = 2 byte = 1 character索引
从上面这些能够计算索引的长度:文档
10*3(varchar 10)+3(标记变长)+1(标记可为null)+其余(不清楚)
组合索引的长度10*3+11已经大于38,因此推论只用到了组合索引的一部分。get
五、下面是对explain其余的参数进行说明:it
table:table
这是表的名字。class
type:
链接操做的类型。下面是MySQL文档关于ref链接类型的说明:
“对于每一种与另外一个表中记录的组合,mysql将从当前的表读取全部带有匹配索引值的记录。若是链接操做只使用键的最左前缀,或者若是键不是UNIQUE或PRIMARY KEY类型(换句话说,若是链接操做不能根据键值选择出惟一行),则MySQL使用ref链接类型。若是链接操做所用的键只匹配少许的记录,则ref是一种好的链接类型。”
在本例中,因为索引不是UNIQUE类型,ref是咱们可以获得的最好链接类型。
若是EXPLAIN显示链接类型是“ALL”,并且你并不想从表里面选择出大多数记录,那么MySQL的操做效率将很是低,由于它要扫描整个表。你能够加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。
本例子中是rang,下面是对type值的解释
这是重要的列,显示链接使用了何种类型。从最好到最差的链接类型为const、eq_reg、ref、range、indexhe和ALL
Type:告诉咱们对表所使用的访问方式,主要包含以下集中类型;
◇ all:全表扫描
◇ const:读常量,且最多只会有一条记录匹配,因为是常量,因此实际上只须要读一次;
◇ eq_ref:最多只会有一条匹配结果,通常是经过主键或者惟一键索引来访问;
◇ fulltext:
◇ index:全索引扫描;
◇ index_merge:查询中同时使用两个(或更多)索引,而后对索引结果进行merge 以后再读
取表数据;
◇ index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个
主键或者惟一索引;
◇ rang:索引范围扫描;
◇ ref:Join 语句中被驱动表索引引用查询;
◇ ref_or_null:与ref 的惟一区别就是在使用索引引用查询以外再增长一个空值的查询;
◇ system:系统表,表中只有一行数据;
◇ unique_subquery:子查询中的返回结果字段组合是主键或者惟一约束;
possible_keys:
可能能够利用的索引的名字。这里的索引名字是建立索引时指定的索引昵称;若是索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义每每不是很明显。
key:
它显示了MySQL实际使用的索引的名字。若是它为空(或NULL),则MySQL不使用索引。
key_len:
索引中被使用部分的长度,以字节计
ref:
列出是经过常量(const),仍是某个表的某个字段(若是是join)来过滤(经过key)
的;
rows:
MySQL所认为的它在找到正确的结果以前必须扫描的记录数。显然,这里最理想的数字就是1。