数据库索引 随便吹

数据库索引

cnblogs

csdn

目录

索引

索引是数据库中对某一列或多个列的值进行预排序的数据结构,提高检索效率

存储单元:

磁盘最小存储单元是 扇区,512 字节
文件系统的最小存储单元是 块,4k
InnoDB存储引擎的最小储存单元是 页,16K。

局部性原理与磁盘预读:

当存储器的某个位置的数据被访问,其附近位置的数据也会被访问

在 MySQL 中我们的 InnoDB 页的大小默认是 16k,当然也可以通过参数设置:

全表扫描

主键索引表,从左往右扫描叶子节点

总结 mysql InnoDB 中主键索引 B+ 树是如何组织数据、查询数据:

  1. InnoDB 存储引擎的最小存储单元是页,页可以用于存放数据也可以用于存放键值 + 指针,在 B+ 树中叶子节点存放数据,非叶子节点存放键值 + 指针。

  2. 索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而在去数据页中查找到需要的数据

  3. 聚簇索引

优化

标准的单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表
因为,MySQL 为了提高性能,会将表的索引装载到内存中。InnoDB buffer size 足够的情况下,其能完成全加载进内存,查询不会有问题。但是,当单表数据库到达某个量级的上限时,导致内存无法存储其索引,使得之后的 SQL 查询会产生磁盘 IO,从而导致性能下降。当然,这个还有具体的表结构的设计有关,最终导致的问题都是内存限制。

根据一个md5过的id将大表水平分割

索引

优势:减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;

劣势:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作的效率,因为在修改数据表的同时还需要修改索引表

常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引

  1. 主键索引:不允许重复,不允许空值,通常递增
  2. 唯一索引:用来建立索引的列的值必须是唯一的,允许空值
  3. 普通索引:用表中的普通列构建的索引,没有任何限制
  4. 全文索引:用大文本对象的列构建的索引
  5. 联合索引:用多个列组合构建的索引,这多个列中的值不允许有空值。 组合索引相当于建立了a, ab, abc 三个索引,遵循最左原则,而b或者c是不会使用索引的

Mysql索引主要有两种结构:B+Tree索引和Hash索引

Inodb存储引擎 默认是 B+Tree索引

MyISAM 存储引擎 默认是Fulltext索引

Memory 存储引擎 默认 Hash索引

B+Tree B-Tree(-是连接符):

相同:
都是平衡多叉树结构,多路搜索树

不同:
B+tree所有关键字存储在叶子节点,非叶子节点不存储真正的data。(键值 表中记录的主键)

B+tree为所有叶子节点增加了一个链指针(指针 存储子节点地址信息)

叶子节点data数据记录都。(data 表中记录除主键外的数据)

B-Tree

每个节点中存储key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率

B+Tree

所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度

B+Tree索引可以分为聚集索引和辅助索引

聚集索引的叶子节点存放整张表的行记录数据
辅助索引的叶子节点存储聚集索引的主键

mongodb

redis

MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。

InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。(提供行级锁)

BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。

Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。