Mysql索引浅析

mysql索引类型

索引数据结构类型:Hash索引、B+Tree索引。

常见索引类型:普通索引、唯一索引、主键索引、全文索引(Myisam引擎)、组合索引。

一,聚簇索引与非聚簇索引

1,非聚簇索引:叶子结点存放的是数据磁盘地址,非叶子结点存放索引值。这也是为什么myisam存储引擎会有索引文件和数据文件之分的原因。
1.1,索引过程:
主键索引:B+树,通过索引值搜索叶子结点数据磁盘地址,然后根据磁盘地址进行I/O操作,找到数据。
非主键索引:与主键索引一致。
2,聚簇索引:叶子结点存放数据。索引文件与数据文件是同一个文件。
2.1,索引过程:
主键索引:通过索引值查找到叶子结点数据。
非主键索引:通过索引值查找到叶子结点主键索引值,然后重复主键索引过程,查找到数据。也就是说非主键索引树,叶子结点存放的是主键值。
二,索引创建
1,选择创建索引的列
一般选择where条件的列以及join连接条件中的列。单个列索引组成的多条件索引效率,与单个列组成的复合索引效率。后者效率更高一些。
2,复合索引下的最左原则
多列组成的复合索引,必须有第一列才能使用到索引。
三,什么情况下索引才会产生效果
mysql只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。
可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE ‘Mich%’;”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE ‘%ike’;”这个查询不会使用索引。
四,分析索引效率
通过explain命令可以分析sql语句的执行效率。结果字段说明如下:
table:这是表的名字。
type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明:
“对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一种好的连接类型。”
在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。
如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。
possible_keys:
可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义往往不是很明显。
Key:
它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。
key_len:
索引中被使用部分的长度,以字节计。在本例中,key_len是102,其中firstname占50字节,lastname占50字节,age占2字节。如果MySQL只使用索引中的firstname部分,则key_len将是50。
ref:
它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。
rows:
MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。
Extra:
这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL只是提醒我们它将用WHERE子句限制搜索结果集。

猜你喜欢

转载自www.cnblogs.com/hf-china/p/10408413.html