mysql索引概述

本文深入探讨MySQL中索引的工作原理,包括B+树的选择原因、MyISAM与InnoDB存储引擎的区别、索引的选择性及最左前缀原则等。

本文草稿与三月初创作,但是由于刚换新工作比较忙,因此没及时完成并发表。

索引的主要作用是加快数据的查找,但是索引本身也是需要存储的,由于索引文件可能很大,因此不能常驻内存,在用到的时候需要从硬盘种加载,常识性我们都知道,计算机io是非常耗时的操作,那么如何减少io便是索引设计的重点。


mysql的索引使用的是b+树(数据结构不详细介绍,请自行查阅资料),那么为什么要用b+树,不用b-树或者红黑树。假设树每访问一层需要一次io,那这样首先把红黑树给排除掉。再来对比b-tree和其变形b+tree,首先b-tree路由节点也可能保存数据本身,这就导致同样大小的路由节点保存的路由信息就会减少,一个节点的数据太大,一次io读取不了完整的节点信息,那么就需要多次io耗时增加。由于b+tree路由节点只保存路由信息,那么相同的空间能放更多的路由信息,这也就意味着更少的io。

mysql索引属于存储引擎,不同存储引擎实现方式不同。


MyISAM引擎使用b+tree作为索引,叶子节点data存放的是记录地址。MyISAM中主索引与辅助索引形式是一样的,主索引要求key不能重复,辅助索引key可以重复。这种索引方式叫非聚集索引。


InnoDB引擎,与MyISAM索引与数据分开存放不同的是,InnoDB引擎数据文件本身就是一个索引,InnoDB引擎数据存放是按b+tree结构组织存放的,叶子节点包含全部的数据信息,这个树的key就是主键,这样的设计会导致数据按照主键聚集,所以这种方式叫聚集索引,正是因为这样,InnoDB引擎要求表必须有主键,这样的设计可以使按主键的查找非常高效。
InnoDB引擎辅助索引叶子节点存放的是主键,正式这个设计,所以不建议主键使用长字段,因为会导致辅助索引data占用空间太大。


最左前缀
现在假设有一个表Table1 ,含有A,B,C,D,E五个字段
现在建一个联合索引A,B,C
什么时候能用到这个索引呢
全部使用
where A=1 AND B=1 AND C=1(where C=1 AND B=1 AND A=1...)
这个时候是可以用上的,三个都用上
使用左边两个
where A=1 AND B=1 (where B=1 AND A=1)
使用左边一个
这个时候也能用上,用上两列
where A=1 AND C=1 (where C=1 AND A=1)
这个时候也能用上,但只能使用A
缺少最左边一个
where B=1 AND C=1(where C=1 AND B=1)
这个时候用不上
剩下情况不一一举例
结论是从最左边匹配,条件中能从最左边连续匹配几个就能用到几个。

范围查询
范围会用到索引吗?会,不过在范围字段后的列就不再使用索引。
例如 
SELECT * FROM TABLE1 WHERE A=2 AND B<3 AND C=2
这种情况只能使用索引A,B。
同理两个连续的范围也只能使用上第一个匹配的范围索引,如下
SELECT * FROM TABLE1 WHERE A=2 AND B<3 AND C<3
只能使用A,B。


like会用到索引吗
只要like中的通配符不出现在最左端就能使用索引。


查询条件中有函数会使用索引吗
不会


索引选择性

假设有100调数据 a列不同的数据有90条,那么选择性为0.9,选择性越接近1索引性能越好。


其实本来在着手写这篇文章时编写思路的把索引相关的东西都讲到,但是由于放了将近一个月的时间,思路完全丢失,想不起来本来打算按哪个线写下去了,以后也长个经验,写文章一气呵成,不然就不写。这篇文章就等慢慢遇到哪点想写就补充到里边吧。

### MySQL 紾引概述 MySQL 索引是一种用于加速数据库查询的技术,其基本目的是通过提供一种高效的访问路径来减少检索数据所需的时间。索引类似于书籍的目录,能够帮助数据库管理系统快速定位所需的记录而不需要扫描整个表的内容。 #### 1. **索引的作用** 索引的主要作用在于提高查询效率。当执行 `SELECT` 查询时,如果没有索引MySQL 将不得不进行全表扫描(Full Table Scan),这意味着它需要逐一检查每一行数据以寻找符合条件的结果。这种操作在大规模数据集中非常耗时。然而,有了索引之后,可以通过更快的方式找到目标数据[^1]。 #### 2. **索引的工作原理** MySQL索引基于多种数据结构实现,其中最常见的是 B+ 树。B+ 树的特点是可以有效地支持范围查询和排序操作,同时保持较高的插入与删除性能。此外,还有其他类型的索引,例如哈希索引、全文索引等,每种都有各自的适用场景: - **B+ 树索引**:这是最常见的索引形式,广泛应用于主键索引和其他普通索引中。它的优势在于不仅支持等值查询,还支持范围查询和排序操作。 - **哈希索引**:适用于精确匹配查询,具有极高的查询速度,但在范围查询和支持排序方面表现较差[^4]。 - **全文索引**:主要用于文本搜索,允许用户查找文档中的关键词而非仅仅对比固定值。此功能通常搭配 `MATCH ... AGAINST` 使用,而不适合普通的 `WHERE` 条件过滤[^3]。 #### 3. **索引的设计原则** 并不是所有的列都适合作为索引对象。选择合适的字段建立索引至关重要,因为它直接影响到系统的整体性能。一般来说,应该优先考虑那些频繁出现在 WHERE 子句或者 JOIN 操作中的列作为候选者。另外需要注意的是,并非越多越好——过多的索引可能会增加写入成本并占用更多存储空间。 #### 4. **实际使用建议** 为了充分发挥索引的优势,在日常开发过程中应当遵循以下几个准则: - 避免不必要的宽泛条件;尽量缩小筛选范围以便更好地利用现有索引; - 对经常更新但很少被查询的列谨慎添加索引; - 定期分析慢日志找出潜在瓶颈所在之处进而调整相应配置或重建缺失索引。 ```sql -- 创建普通索引的例子 CREATE INDEX idx_example ON table_name(column_name); -- 删除已存在的索引 DROP INDEX index_name ON table_name; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值