【MySQL数据库】索引 - 结构 学习记录
MySQL - 索引 - 结构
- 引言
- 结构
引言
什么是索引
索引(Index)就是 帮助数据库快速找到数据的数据结构(有序)
(可以看出,索引是一种数据结构)
可以把它类比成 书的目录:
- 你想在一本 500 页的书里找到“二叉树”这一章
- 没有目录 → 只能一页一页翻(全表扫描)
- 有目录 → 直接跳到 201 页(索引定位),效率高很多
在数据库里,道理一样: - 没有索引:需要把整张表一行一行读出来,直到找到目标数据
- 有索引:可以直接通过索引快速定位到目标数据
假如有这样一个表
现在执行语句
select * from user where age = 45
如果没有索引,MySQL 查数据只能 全表扫描,一行一行去比对
如果有索引,这里假设使用 二叉搜索树 作为索引,那么这张表就会变成(只是以二叉搜索树为例)
只需要比对三次就找到了45
由此可以发现,有 索引 的情况,搜索效率是非常高的
事物都具有两面性,索引 既有优点也有缺点
优点:
- 提高搜索效率,降低数据库 IO成本
- 提高排序效率
缺点: - 占用空间
- 降低更新表的速度
结构
在上一篇 存储引擎 中提到过,索引 是在 存储引擎层 实现的
也就是说,存储引擎 不同,索引的结构也不同,主要包含以下几种
索引结构 | 描述 |
---|---|
B+树索引 | 最常见的索引类型,大部分引擎都支持 B+ 树索引 |
Hash索引 | 基于哈希表,只有精确匹配索引列的查询才有效,不支持范围查询 |
R树(空间索引) | 空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少 |
Full-text(全文索引) | 采用倒排索引,把文档中的关键词分词后建立索引(用于模糊搜索、关键词搜索,不适合做结构化数据的查找) |
对比这几种 索引 在存储引擎中的支持情况
索引 | InnoDB | MyISAM | Memory |
---|---|---|---|
B+树索引 | 支持 | 支持 | 支持 |
Hash索引 | 不支持 | 不支持 | 支持 |
R树索引 | 不支持 | 支持 | 不支持 |
Full-text | 5.6版本后支持 | 支持 | 不支持 |
为什么不用其他的数据结构
二叉树:
在学习二叉树的时候我们都知道,如果一组数据是按序给出的,那么形成的二叉树的结构就会是一个链表,查询性能大大降低
此外,二叉树一个根结点只有两个子结点,如果数据量很大,那么二叉树的层级就会较深,搜索效率降低
B 树:
和二叉搜索树一样,如果数据量很大,层级会较深,进而搜索效率降低