MySQL常见索引类型:主键索引、唯一索引、普通索引、全文索引、组合索引(联合索引,多列索引)
主键索引
ALTER TABLE `table_name` ADD PRIMARY KEY key_name(`filed_name`);
具有唯一性和自增长性,查询效率最快
唯一索引
ALTER TABLE `table_name` ADD UNIQUE key_name(`filed_name`);
索引列的值必须唯一,但允许有空值。
普通索引
ALTER TABLE `table_name` ADD INDEX key_name(`filed_name`)
在查询中经常出现的列,特别百万级别或千万级别的数据量,使用普通索引会有特别显著的效果
组合索引
ALTER TABLE `table_name` ADD INDEX / KEY key_name(列名1,列名2,列名3)
在where查询的多个字段上建立。
组合索引遵循最左匹配原则,即`列名1`必须出现在 where 条件中,才会使用到该索引
前缀索引
ALTER TABLE `table_name` ADD INDEX key_name(`filed_name`(length))
全文索引(MyISAM和InnoDB中都支持)
ALTER TABLE 表名 ADD FULLTEXT(列名)
对文本对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法
索引使用的数据结构优缺点对比:
需要明白的两个常识:
1. 索引的使用,是为了提高查询速度。相比于在内存中数据的查找,读取数据时执行磁盘IO操作非常的耗时,所以适合作为索引的数据结构应是尽可能少的执行磁盘IO操作。
2. 依据局部性原理进而实现的磁盘预读:
当访问磁盘中一个地址数据的时候,与其相邻的数据很快也会被访问到。为提高数据读取的效率,磁盘会预读该地址附近的数据。
B-Tree作为索引:
该数据结构的特点:
1. 每个结点中的值的个数(n)满足: 1 <= n < m(B树的阶)
2. 所有的叶子结点都位于同一层
3. 每层结点中的值都是升序排列,每个值的左子树中的所有的值都小于它,而右子树中的所有的值都大于它
优点:
B-Tree中每个节点可以存储多个关键字,与平衡树来讲,它的一次磁盘I/O可以读取到更多的关键字,且降低了树的深度
B+Tree更适合作为索引:
特点:具有B-Tree树的所有特点,且
1. 除叶子节点外,每个元素不保存数据,只用来索引,所有数据都保存在叶子节点
2. 所有的中间结点元素都同时存在于子节点,他们在子节点元素中是最大(或最小)元素
3. 所有的叶子结点中包含了全部元素的信息,且叶子结点按关键字的排列顺序形成链表
优点:
1. 从磁盘读取角度来讲:在非叶子节点中,由于不保存数据,所以可以容纳更多的关键字,相比于B-Tree,磁盘读取一页关键字数据增加,进而减少了磁盘的I/O次数,且再次降低了树的高度
2. 形成链表的叶子节点方便全局或范围查找
b树b+树图文参考:经典搜索算法之B树与B+树_b+树和b树的搜索速度_超级战斗王的博客-优快云博客
从磁盘I/O角度来讲索引的数据结构:https://www.playscala.cn/article/view?_id=10-5d318144eeab561d2405e2de https://www.cnblogs.com/aspirant/p/9214485.html
不同索引的区别与适用场景:
B+TREE:
1. 范围查找
2. 多级索引查找范围数据
HASH索引适用场景:
Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它适用于等值查找。MySQL中使用Hash索引作为数据结构的存储引擎只有Memory。
索引的缺点:
- 虽然索引大大提高了查询速度,同时却会降低更新表的速度; 如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要更新索引文件
- 建立索引会占用磁盘空间
MySQL下的聚簇索引与非聚簇索引:
在《数据库原理》一书中解释到:
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。
MyISAM的非聚簇索引结构:
MyISAM是按列值与行号来组织索引的。它的叶子节点中保存的实际上是指向存放数据的物理块的指针。
MyISAM存储引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的,所以一二级索引基本没多大区别。
InnoDB的聚簇索引结构:
聚簇索引:
InnoDB下,每一个表都有一个聚簇索引,它要么是主键,要么是拥有唯一索引(unique)的列,要么是自动产生的隐式的聚簇索引列。InnoDB 使用它存储表中每一行的数据。
如何加快查询速度:因为通过聚簇索引搜索,会直接指向包含该数据的数据页。
非聚簇索引:
通常也称之为 二级索引 ( Secondary Indexes ) 或 「 辅助索引 」 ,一般是指聚簇索引之外的所有其它索引。
两者区别:
1. InnoDB 会使用聚簇索引来存数据和索引数据,而非聚簇索引的目的仅仅是加快查询速度
2. InnoDB下的表,有且只有一个聚簇索引,非聚簇索引由用户添加
3. 非聚簇索引一定包含聚簇索引,因此,使用二级索引时,会先找到主键值,再通过主键的聚簇索引查找相应的数据。
MySQL下的聚簇与非聚簇索引介绍:MYSQL索引:对聚簇索引和非聚簇索引的认识_alexdamiao的博客-优快云博客