上篇文章我们说了,联合索引会用两个以上列来创建索引,b+树是一颗,先用c2列排序,若结果相同,则用c3排序。innoDB的b+树特点是根节点保持不变,新表是先默认有聚簇索引,先有一个没有数据的根目录节点,放用户记录数据放入根几点中,当数据慢了,页分裂,会有多的节点,此刻根节点进化成根目录记录节点,数据存入底层节点。二级索引的内节点保证一致性,存入列值的时候加个主键。
myISAM简介
我们知道了innoDB搜索引擎的是索引即是数据,分为列表值索引树,和聚簇索引树,聚簇索引那颗b+树索引即是数据,所有的用户记录数都存在叶子节点。而myISAM虽然也是B+树,但索引和数据是分开的。
myISAM会吧用户记录数据全部放在一个文件里,称为数据文件,这个文件不会划分若干页,有多少记录就往里面塞,通过每一行对应的行号快速访问,因为随意塞入,不会按主键大小排序,不能用二分查找法查找。
之后会吧索引信息存储到另一个索引文件里,myISAM会单独为表的主键创建索引,只不过在叶子节点存储的不是用户记录数据,而是主键+行号,意味着找到到对应行号之后,会用行号去数据文件里再次找全部数据。所以myISAM每次查询都是必须要回表的,相当于二级索引。(innoDB的聚簇索引是直接在根目录记录页根据主键找到对应的内节点,在找到对应的底层叶子节点上的全部数据)。
有需要的话,也可以建立二级索引或者联合索引,只是叶子节点存放的是列值+行号。
创建索引和删除索引:
说了那么多理论知识,那如何实战呢?mysql中的innoDB和myISAM表会自动为主键或者申明的为unique的列创建聚簇索引,但如果需要给其他列创建二级索引,则需要在sql里显示指明。为啥不自动创建呢,别忘了越多的索引意味着越多的b+树,意味着插入和删除都需要巨大的内存来维护b+树,很耗费性能。
建表的时候可以创建索引,index 和 key关键字都可以使用,指定indx_tb_col表的c2列为idx_c2名称的索引:
create table index_tb_col( c1 int, c2 int, c3 char(1), index idx_c2 (c2) )row_format=Compact;
也可以在表创建完成之后,指定c3为idx_c3名称的索引:
mysql> alter table index_tb_col add index idx_c3 (c3); Query OK, 0 rows affected (0.04 sec)
也可以添加联合索引和删除索引:
//复合索引 mysql> create table index_tb_col( -> c1 int, -> c2 int, -> c3 char(1), -> primary key (c1), -> index idx_c2_c3 (c2,c3) -> )row_format=Compact; Query OK, 0 rows affected (0.03 sec) //删除索引 mysql> alter table index_tb_col drop index idx_c2_c3; Query OK, 0 rows affected (0.03 sec)