- InnoDB不支持HASH索引(但是InnoDB在内部利用哈希索引来实现其自适应哈希索引功能)
- InnoDB会根据表的使用情况自动为表生成hash索引, 不能人为干预是否在InnoDB一张表中创建HASH索引
- 当InnoDB某些索引值被使用的特别频繁时, 会在内存中基于Btree的索引之上再创建一个HASH索引, 这样BTREE索引也具备了HASH索引的一些优点
unique key unique_username using btree(user_name)
这里的using btree 只是显式指定的使用的索引的方式为b+树, 对于innodb来说默认的索引方式也是用b+树, 因此可以不写
聚簇索引和非聚簇索引的区别?
聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法. 特点是存储数据的顺序和索引顺序一致. 一般情况下主键会默认创建聚簇索引, 且一张表只允许存在一个聚簇索引.
聚簇索引的叶子节点就是数据节点, 而非聚簇索引的叶子节点仍然是索引节点, 只不过有指向对应数据块的指针
MyISAM的是非聚簇索引, B+Tree的叶子节点上的data, 并不是数据本身, 而是数据存放的地址. 主索引和辅助索引没啥区别, 只是主索引中的key一定得是唯一的
InnoDB使用的是聚簇索引, 将主键组织到一棵B+树中, 而行数据就储存在叶子节点上, 若使用"where id = 14"这样的条件查找主键, 则按照B+树的检索算法即可查找到对应的叶节点, 之后获得行数据
非聚集索引中的聚集索引键
在MySQL 5.6.9版本前, Innodb的非聚集索引中包含聚集索引的索引键, 但只起到通过非聚集索引定位记录的作用, 但在MySQL 5.6.9之后版本中, 优化器会考虑非聚集索引中包含的聚集索引键来提升查询性能, 并提供优化器选项use_index_extensions来开启或关闭该特性.
假设有表TB1(ID,C1,C2), ID为主键聚集索引, 然后在列C1建立索引IDX_C1(C1):
- 在MySQL 5.6版本前, 索引类似于IDX_C1(C1) INCLUDE(ID);
- 在MySQL 5.6版本中, 索引类似于IDX_C1(C1,ID);
无论是MySQL 5.5还是MySQL 5.6版本中, 非聚集索引上的数据都是先按照非聚集索引键在按照聚集索引键进行排序, 即在非聚集索引键上值相同的记录会按照聚集索引进行排序.
B+tree 如何进行优化? 索引遵循哪些原则?
最左前缀匹配原则, 非常重要的原则, mysql会一直向右匹配直到遇到范围查询
=和in可以乱序
尽量选择区分度高的列作为索引
查询时, 索引列不要参与计算
还有什么其他的索引类型, 各自索引有哪些优缺点?
B+ Tree, Hash, FullText, R Tree
如何管理 MySQL索引?
主要说一下索引的创建, 修改和删除, 以及不同的索引类型: 普通索引, 唯一索引, 全文索引, 空间索引, 单列索引, 多列索引