《MySQL 实战 45 讲》课程学习笔记(四)

这篇具有很好参考价值的文章主要介绍了《MySQL 实战 45 讲》课程学习笔记(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

深入浅出索引

  • 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。

索引的常见模型

哈希表

  • 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。
  • 哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。
  • 不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。
    《MySQL 实战 45 讲》课程学习笔记(四),数据库,mysql,学习,笔记
  • 哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。

有序数组

  • 有序数组在等值查询和范围查询场景中的性能就都非常优秀。
    《MySQL 实战 45 讲》课程学习笔记(四),数据库,mysql,学习,笔记
  • 有序数组索引只适用于静态存储引擎。

二叉搜索树

  • 二叉搜索树的特点是:每个节点的左儿子小于父节点,父节点又小于右儿子。
    《MySQL 实战 45 讲》课程学习笔记(四),数据库,mysql,学习,笔记
  • 为了维持 O(log(N)) 的查询复杂度,你就需要保持这棵树是平衡二叉树。为了做这个保证,更新的时间复杂度也是 O(log(N))。
  • 树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。
  • N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。

InnoDB 的索引模型

  • InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。
  • 根据叶子节点的内容,索引类型分为主键索引和非主键索引。
    • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
    • 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
    • 基于非主键索引的查询需要多扫描一棵索引树,即回表。因此,我们在应用中应该尽量使用主键查询。
  • 自增主键的插入数据模式,符合递增插入的场景。
    • 每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。
    • 而有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。
    • 主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。
  • 覆盖索引
    • 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
  • 最左前缀原则
    • B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。
    • 不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索。
    • 这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。
  • 在建立联合索引的时候,如何安排索引内的字段顺序?
    • 第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
  • 索引下推
    • 索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
    • 在满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一。
    • 我们在使用数据库的时候,尤其是在设计表结构时,也要以减少资源消耗作为目标。

文章来源地址https://www.toymoban.com/news/detail-620343.html

到了这里,关于《MySQL 实战 45 讲》课程学习笔记(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Redis 核心技术与实战》课程学习笔记(五)

    那我们总说的 Redis 具有高可靠性,又是什么意思呢? 其实,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断。 AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增加副本冗余量,将⼀份数据同时保存在多个实例上。 即使有一个实例出现了故障,需要过一段时

    2024年02月13日
    浏览(34)
  • 《kafka 核心技术与实战》课程学习笔记(七)

    压缩(compression)秉承了用时间去换空间的经典 trade-off 思想,具体来说就是用 CPU 时间去换磁盘空间或网络 I/O 传输量,希望以较小的 CPU 开销带来更少的磁盘占用或更少的网络 I/O 传输。 目前 Kafka 共有两大类消息格式,社区分别称之为 V1 版本和 V2 版本。 不论是哪个版本,

    2024年02月11日
    浏览(38)
  • 《Redis 核心技术与实战》课程学习笔记(三)

    Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。 多线程的开销 我们刚开始增加线程数时,系统吞吐率

    2024年02月12日
    浏览(31)
  • 《kafka 核心技术与实战》课程学习笔记(九)

    拦截器基本思想就是允许应用程序在不修改逻辑的情况下,动态地实现一组可插拔的事件处理逻辑链。 它能够在主业务操作的前后多个时间点上插入对应的“拦截”逻辑。 Spring MVC 拦截器的工作原理: Kafka 拦截器借鉴了这样的设计思路:可以在消息处理的前后多个时点动态

    2024年02月12日
    浏览(39)
  • 《Redis 核心技术与实战》课程学习笔记(六)

    在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制。 哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。 监控 哨兵进程在运行时,周期性地给所有的主从库

    2024年02月13日
    浏览(34)
  • 《kafka 核心技术与实战》课程学习笔记(五)

    严格来说这些配置并不单单指 Kafka 服务器端的配置,其中既有 Broker 端参数,也有主题级别的参数、JVM 端参数和操作系统级别的参数。 Broker 端参数也被称为静态参数(Static Configs): 所谓 静态参数 ,是指你必须在 Kafka 的配置文件 server.properties 中进行设置的参数 ,不管你

    2024年02月11日
    浏览(49)
  • 《Redis 核心技术与实战》课程学习笔记(四)

    一旦服务器宕机,内存中的数据将全部丢失。目前,Redis 的持久化主要有两大机制,即 AOF 日志和 RDB 快照。 AOF 日志是如何实现的? 我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL),也就是说,在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复

    2024年02月12日
    浏览(33)
  • 《kafka 核心技术与实战》课程学习笔记(十)

    Apache Kafka 的所有通信都是基于 TCP 的,而不是基于 HTTP 或其他协议。 在开发客户端时,能够利用 TCP 本身提供的一些高级功能,比如多路复用请求以及同时轮询多个连接的能力。 除了 TCP 提供的这些高级功能有可能被 Kafka 客户端的开发人员使用之外,目前已知的 HTTP 库在很多

    2024年02月11日
    浏览(51)
  • 【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

    课程地址: 黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 1 - 2节) 开场白,HarmonyOS 的一个简介,话不多说,直接看图吧! 工欲善其事必先利其器,开发准备需要两件事:1、开发文档;2、开发工具 打开鸿蒙官方网站,

    2024年04月24日
    浏览(28)
  • 尚硅谷webpack课程学习笔记

    为什么需要使用打包工具? 开发时使用的框架、es6 语法 、less 等浏览器无法识别。 需要经过编译成浏览器能识别的css、js才可以运行。 打包工具可以帮我们编译,还可以做代码压缩、兼容处理、性能优化。 常见的打包工具有什么? vite、webpack、glup、grunt webapck最基本的使用

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包