前言
这篇博客主要是介绍自己在准备银行面试时的MySQL数据库知识
索引
索引的定义
索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据表中数据。
更通俗的说,索引就相当于目录,可以加快检索速度,提高系统性能。索引也是一个文件,需要占用物理空间,此外索引也需要维护。 最常见的就是使用哈希表、B+树作为索引。
索引的创建
-
建表时创建 create table table_name(
.....
....
....
index index_name(column(length))
)
-
直接创建 create index index_name on table_name (column(length));
-
修改表结构添加索引 alter create index index_name on table_name (column(length));
索引的底层实现
Hash索引
哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,数据库引擎会对所有的索引列计算一个hash code,并且会将所有的hash code存储在索引中,同时在索引表中保存指向每个数据行的指针。
B+树索引
B+树
- 规则
(1)B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加; (2)B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样,查询速度稳定高; (3)B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针,从而构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
Hash索引 Vs B+树索引
(待补充)
常见索引
- 唯一索引:Unique,索引列的值必须唯一,允许有空值
- 主键索引:Primary Key,利用主键建立的索引,特殊的唯一索引,不允许有空值
- 全文索引:FullText,MyISAM和InnoDB支持,允许有重复值和空值,可以在char、varchar、text类型的列上创建。主要用来查找文本中的关键字,而不是直接与索引中的值比较,它更像是一个搜索引擎,全文索引需要配合match against操作使用,而不是一般的where语句加like。
- 组合索引多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用
最左前缀原则
mysql 建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:
- 如果有一个 2 列的索引 (col1, col2),则已经对 (col1)、(col1, col2) 上建立了索引;
- 如果有一个 3 列索引 (col1, col2, col3),则已经对 (col1)、(col1, col2)、(col1, col2, col3) 上建立了索引;
mysql会一直向右匹配直到遇到范围查询
聚集索引 VS 非聚集索引
聚集索引是指索引和数据的顺序一致的索引,一个表中只能有一个聚集索引,一般为主键索引。 按照此定义,除此之外的索引都是非聚集索引,并且一个表中可以有多个非聚集索引 在InnoDB中B+树索引的叶子结点存储了整行数据的主键索引,
索引失效
- 使用!= 或者<>
- 复合索引未使用左列字段
- like以%开头
- where中索引列有运算或函数
- 条件中有 or
- 索引列的数据类型存在隐式转换
|