InnoDB具有B+树索引,全文索引,哈系索引。其中哈希索引是自动为表添加的,不能人为干预。而B+树索引是最常用的索引,根据键值对快速找到数据。B+树的索引不能找到一个特定键值对的具体行,它是先找到一个页,再载入页来查找行,最后得到特定数据。
看看B+树的构造和由来
根据《算法导论》,B树这个数据结构是专为磁盘设计的。因为磁盘的读取比内存慢得多,可能要相差5个数量级.
像二叉树那种数据结构还是要读取log2(n)次数据,显然对于磁盘而言,读得次数越多,速度越慢。B+树的设计是有多个分支,一次性读取多个数据页(B树节点),然后进行很多次的if..else判断,再读取下一次的数据页(B树节点).这样做能够减小从磁盘读取的次数logm(n),m为树的分支树。
B+树的另一个特点是,所有数据都在叶子节点上,非叶子节点都是索引。而且叶子节点上的数据都是顺序存放的,形成了类似于链表的东西。
在写入,删除的过程中进行的操作还是很复杂的。变换有点像红黑树,不想详细讨论了。
聚簇索引
这是InnoDB的默认的索引,之前说过InnoDB是索引组织表,这里的索引就是指这个聚簇索引。它根据每张表的主键来建立B+树索引,这个索引和数据是存放在一起的,所以查询优化更倾向于使用聚簇索引来查找数据。
辅助索引
这个是用户自己建立的索引,叶子节点不包含行的所有数据。除了用于建立索引的列外,叶子节点还包含一个书签,用来告诉InnoDB在哪里找到与索引相对应的行数据。由于InnoDB是索引组织表,这个书签保存的就是相应行数据的聚簇索引键。
辅助索引一般只是用于找到聚簇索引的键,而聚簇索引才是找数据的。
SQL索引语句
alter table tb_name
add key [index_name]
[index_type] (col1,col2,...)
alter table tb_name
drop [primary] key index_name
create [unique] index index_name
[index_type] on tb_name(col1,col2,..)
drop index index_name on tb_name
show index from tb_name;
mysql> show index from film\G;
********************* 1. row ********************
Table: film
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: film_id
Collation: A
Cardinality: 1000
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
哈希索引
哈希索引对于where index=xxx时查找很快,对范围查找就无能为力了