![](https://csdnimg.cn/release/download_crawler_static/87527173/bg5.jpg)
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点
时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修
改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
空间方面:索引需要占物理空间。
(9)聚簇索引和非聚簇索引的区别
聚簇索引的叶子节点存放的是主键值和数据行,支持覆盖索引
非聚簇索引的叶子节点存放的是主键值或数据记录的地址(InnoDB 辅助索引的 data 域存储
相应记录主键的值,MyISAM 辅助索引的 data 域保存数据记录的地址)
(10)MyISAM 和 InnoDB 实现 B+树索引方式的区别是什么?
MyISAM,B+Tree 叶节点的 data 域存放的是数据记录的地址,在索引检索的时候,首先按
照 B+Tree 搜索算法搜索索引,如果指定的 key 存在,则取出其 data 域的值,然后以 data
域的值为地址读取相应的数据记录,这被称为“非聚簇索引”
InnoDB,其数据文件本身就是索引文件,相比 MyISAM,索引文件和数据文件是分离的,其
表数据文件本身就是按 B+Tree 组织的一个索引结构,树的节点 data 域保存了完整的数据记
录,这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引,这被称为
“聚簇索引”或者聚集索引,而其余的索引都作为辅助索引,辅助索引的 data 域存储相应记
录主键的值而不是地址,这也是和 MyISAM 不同的地方。
在根据主键索引搜索时,直接找到 key 所在的节点即可取出数据;根据辅助索引查找时,则
需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段
为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
总结:InnoDB 主键索引使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用
的都是非聚簇索引。
(11)MySQL 中有几种索引类型,可以简单说说吗?
FULLTEXT :即为全文索引,目前只有 MyISAM 引擎支持。其可以在 CREATE TABLE ,ALTER
TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全
文索引。
HASH :由于 HASH 的唯一(几乎 100%的唯一)及类似键值对的形式,很适合作为索引。HASH
索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高
效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
BTREE :BTREE 索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉
树),每次查询都是从树的入口 root 开始,依次遍历 node,获取 leaf。这是 MySQL 里默认
和最常用的索引类型。
RTREE :RTREE 在 MySQL 很少使用,仅支持 geometry 数据类型,支持该类型的存储引擎
只有 MyISAM、BDb、InnoDb、NDb、Archive 几种。相对于 BTREE,RTREE 的优势在于范
围查找。
(12)覆盖索引是什么?