Mysql索引浅析

mysql索引类型mysql

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

常见索引类型:普通索引、惟一索引、主键索引、全文索引(Myisam引擎)、组合索引。数据结构

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

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子句限制搜索结果集。
相关文章
相关标签/搜索