MySQL索引

本文详细介绍了MySQL索引的工作原理,包括磁盘IO与预读、索引分类(如B树、B+树)、聚集索引与非聚集索引的区别、添加索引的方式以及索引失效的情况。重点讲解了B+树的优势,以及在不同存储引擎如MYISAM和InnoDB中的应用。此外,还讨论了如何避免索引失效,特别是在联合索引和多条件查询中的最佳实践。
摘要由CSDN通过智能技术生成

索引帮助数据库高效获取数据的数据结构,索引是为了加快查询速度,减少IO。

磁盘IO与预读

数据库数据是保存在磁盘上的,但为了提升性能,会把部分数据读取到内存进行计算。访问磁盘的成本是访问内存成本的十万倍左右。

计算机操作系统对磁盘读取数据进行了优化,当一次IO时,不仅会把当前磁盘地址的数据读取到,而是把相邻的数据也读取到内存缓冲区中。(局部预读性原理:当计算机访问一个地址的数据时,与其相邻的数据也会很快被访问到)。每次IO读取的数据我们称之为一页(page),具体一页有多大数据和操作系统有关,一般为4k或8k,也就是说当我们读取一页数据时,实际只发生了一次IO。

索引分类

从存储结构分类

  • Btree(B+tree, B-tree)
  • 哈希索引
  • full text全文索引
  • Rtree

从应用层次划分

  • 普通索引:一个索引只包含单列,一个表可以有多个单列索引;
  • 唯一索引:索引的值必须唯一,但允许有空值;
  • 复合索引:一个索引包含多个列。
  • 短索引:指定长度的字符串类型的索引(col_name[length])。

从表记录的排列顺序和索引的排列顺序是否一致划分

  • 聚集索引:表记录的排列顺序和索引的排列顺序一致;
  • 非聚集索引:表记录的排列顺序和索引的排列顺序不一致。

聚集索引和非聚集索引

聚集索引:以主键创建的索引;

表记录顺序和索引的排列顺序一致,所以查询速度快,因为只要找到第一个索引值记录,其余的连续性记录也会在物理表中连续存放,一起就会查到。

聚集索引的叶子节点存储的是主键和表中的数据。

缺点:新增比较慢,为保证表记录顺序和索引排列顺序一致,在记录插入时,会对数据页重新排序。

非聚集索引:以非主键创建的索引(也叫二级索引)。

索引的逻辑顺序与磁盘上行的物理存储顺序不同,非聚集索引在叶子节点存储的是索引列和主键,查询时,需要拿到叶子节点的主键再去查询想要的数据,也称为回表。

添加索引

# 主键索引
ALTER TABLE table_name ADD PRIMARY KEY (`column`);

# 唯一索引
ALTER TABLE table_name ADD UNIQUE (`column`);

# 普通索引
ALTER TABLE table_name ADD INDEX index_name (`column`);

# 全文索引
ALTER TABLE table_name ADD FULLTEXT index_name (`column`);

# 多列索引
ALTER TABLE table_name ADD INDEX index_name (`column1`, `column2`, `column3`);

# 短索引
ALTER TABLE table_name  ADD INDEX idx_name(`column1`(2));

索引数据结构

哈希索引

将键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值