丁奇的MySQL基础课
林晓斌(网名“丁奇”)
前阿里资深技术专家
立即订阅
4 人已学习
课程目录
已完结 6 讲
01 | 基础架构:一条SQL查询语句是如何执行的?
免费
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
丁奇的MySQL基础课
登录|注册

04 | 深入浅出索引(上)

林晓斌 2019-08-09
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。
数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重要的概念之一,所以我希望你能够耐心看完。在后面的实战文章中,我也会经常引用这两篇文章中提到的知识点,加深你对数据库索引的理解。
一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本 500 页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。

索引的常见模型

索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。
下面我主要从使用的角度,为你简单分析一下这三种模型的区别。
哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《丁奇的MySQL基础课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • somenzz
    一般的增删改查都是基于业务属性的,如果不基于业务属性设计主键,而通过自增id设计主键,那这样的主键的作用到底在哪?
    2019-08-25
    3
    1
  • 咨询个问题,使用复合主键对插入和查询有什么影响吗
    2019-08-19
    1
  • 逍遥
    自增主键的插入数据模式,正符合了我们前面提到的递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。

    请问最后一句怎么理解?数据页满了不就会触发分裂吗?一直自增不会满吗?
    2019-09-24
    2
  • Sic Pavis
    没有深入了解过这样重建索引会有什么问题,二级索引应该没啥毛病。

    不过依据聚簇索引的特性,二级索引实际上存放的是主键的值。如果删除主键索引,首先这些二级索引会全部失效。在没有显式指定主键的情况下Innodb会取第一个唯一列做主键,而示例中的表没有唯一列,那么Innodb会内部生成一个虚拟唯一列做索引。

    基于此,我猜测删除主键再重建,实际上会随之带来全部二级索引的二次重建(一次是重建为虚拟列,一次重建为新指定的主键)。

    顺带说句题外话,Innodb主键如此关键,居然还允许不指定主键创建表,有点看不懂。
    2019-09-23
  • 老师说的身份证的索引建立,要看业务需要需要的吧,如果很多时候通过身份证号查询内容,这时的将身份证设置主键索引就可以避免查询两次,时间更快,虽说身份证会引起索引多次重排,但身份证所在的索引表其实不会常常变动
    2019-09-21
  • 有点过分,但是
    删除重建主键索引和非主键索引都没有在日常工作中操作过。
    但是根据老师的讲解和个人理解感觉重建二级索引是可行的,但是主键索引这样操作应该会有问题,有可能存在二级索引对主键索引的引用和依赖
    2019-09-21
  • 有点过分,但是
    讲的东西确实是日常开发一直接触的干货,但是往往没有深入理解其所以然,任重而道远,感谢老师干货分享💐
    2019-09-21
  • 等待
    老师您好,文中“表中 R1~R5 的 (ID,k) 值分别为 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6),两棵树的示例示意图如下。”以及文中的下表是什么意思呢,看了许久都不能理解
    2019-08-24
  • 高明ω•﹏•艺人甲 
    主键innodb drop数据库如何选择key做默认主索引
    add primary key默认不会自增
    2019-08-14
  • Lucky
    点赞
    2019-08-14
  • 明翼
    老师您好,想请教下,如果表没有主键索引,那对一个列建立普通索引的话,索引里面的叶子节点数据是有类似于oracle的rowid吗,还是存储什么信息那?
    2019-08-13
    1
  • 丁乐洪
    点赞
    2019-08-12
收起评论
12
返回
顶部