| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【MySQL实战45讲基础篇】(task4)深入浅出索引(上) -> 正文阅读 |
|
[大数据]【MySQL实战45讲基础篇】(task4)深入浅出索引(上) |
学习总结
文章目录一、索引的常见模型索引:提高数据查询的效率,像书的目录一样。 1.1 哈希表(1)哈希表 优点:图中四个 ID_card_n 的值并不是递增的,这样做的好处是增加新的 User 时速度会很快,只需要往后追加。 1.2 有序数组如果你现在要找身份证号在[ID_card_X, ID_card_Y]这个区间的所有用户,就必须全部扫描一遍了。所以,哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。而有序数组在等值查询和范围查询场景中的性能就都非常优秀。 还是上面这个根据身份证号查名字的例子,如果我们使用有序数组来实现的话,示意图如下所示。假设身份证号没有重复,这个数组就是按照身份证号递增的顺序保存的。这时候如果你要查 ID_card_n2 对应的名字,用二分法就可以快速得到,这个时间复杂度是 O(log(N))。
缺点:如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据时,如往中间插入一个记录就必须得挪动后面所有的记录,成本太高。 小结:有序数组索引只适用于静态存储引擎,比如你要保存的是 2017 年某个城市的所有人口信息,这类不会再修改的数据。 1.3 二叉搜索树结构:父节点的左子树所有结点的值均小于父节点,右子树所有结点的值均大于父节点。 查找的时间复杂度:O(log(N)) 为了在查询时,减少度磁盘的次数,即访问尽量少的数据块。那我们可以使用N叉树,N取决于数据块大小。
小结:N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。 二、InnoDB 的索引模型不同存储引擎的索引的工作方式不同;即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。因为InnoDB存储引擎在MySQL中使用最广泛,下面分析其索引模型。 索引组织表:在InnoDB中,表根据主键顺序以索引的形式存放。 有一个主键列为 ID 的表,表中有字段 k,并且在 k 上有索引。
回顾下mysql的基本语句: 2.1 索引类型根据叶子结点的内容分类: 2.2 主键索引和普通索引基于主键索引和普通索引的查询有什么区别?
基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。 三、索引维护3.1 页分裂和页合并B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。如刚才这个图: 页分裂而更糟的情况是,如果 R5 所在的数据页已经满了,根据 B+ 树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去。这个过程称为页分裂。
页合并当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。 3.2 自增主键ex:你可能在一些建表规范里面见到过类似的描述,要求建表语句里一定要有自增主键。当然事无绝对,下面分析一下哪些场景下应该使用自增主键,而哪些场景下不应该。 自增主键是指自增列上定义的主键,在建表语句中一般是这么定义的: 自增主键的插入模式:插入新记录的时候可以不指定 ID 的值,系统会获取当前 ID 最大值加 1 作为下一条记录的 ID 值。 (1)性能角度:有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。 小结:主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。所以,从性能和存储空间方面考量,自增主键往往是更合理的选择。 3.2 适合业务字段直接做主键的场景有没有什么场景适合用业务字段直接做主键的呢? 这就是典型的 KV 场景。由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题。这时就要优先考虑“尽量使用主键查询”原则,直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树。
四、作业对于上面例子中的 InnoDB 表 T,如果你要重建索引 k,你的两个 SQL 语句可以这么写:
如果你要重建主键索引,也可以这么写:
对于上面这两个重建索引的作法,说出你的理解。如果有不合适的,为什么,更好的方法是什么? 【答】重建索引 k 的做法是合理的,可以达到省空间的目的。但是,重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。这两个语句,可以用这个语句代替 : 五、课后答疑Reference(1)《MySQL实战45讲》林晓斌 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:41:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |