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