SQL 必知必会
陈旸
清华大学计算机博士
73338 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

23丨索引的概览:用还是不用索引,这是一个问题

联合索引的最左匹配原则
非聚集索引
聚集索引
全文索引
主键索引
唯一索引
普通索引
特殊情况下的索引价值
数据量少时的索引效率
联合索引
索引的物理实现方式
索引的种类
索引的价值
使用联合索引的查询效率
使用聚集索引和非聚集索引的查询效率对比
对user_gender字段创建索引后的查询效率
未创建索引的查询效率
创建索引前后的效率对比
索引是万能的吗?
索引的种类有哪些?
什么情况下创建索引,什么时候不需要索引?
索引的使用需求和数据分布情况
索引的利与弊
实验4:联合索引的最左原则
实验3:使用聚集索引和非聚集索引的查询效率
实验2:性别字段真的不应该创建索引吗?
实验1:数据行数少的情况下,索引效率如何
索引的概览:用还是不用索引,这是一个问题
总结
实验结果
参考文章
SQL索引知识关系脑图

该思维导图由 AI 生成,仅供参考

提起优化 SQL,你可能会把它理解为优化索引。简单来说这也不算错,索引在 SQL 优化中占了很大的比重。索引用得好,可以将 SQL 查询的效率提升 10 倍甚至更多。但索引是万能的吗?既然索引可以提升效率,只要创建索引不就好了吗?实际上,在有些情况下,创建索引反而会降低效率。
今天我们就来讲一下索引,索引涉及到的内容比较多,今天先来对索引有个整体的认知。
什么情况下创建索引,什么时候不需要索引?
索引的种类有哪些?
索引的原理很好理解,在今天的内容里,我依然会通过 SQL 查询实验验证今天的内容,帮你进一步加深理解。

索引是万能的吗?

首先我们需要了解什么是索引(Index)。数据库中的索引,就好比一本书的目录,它可以帮我们快速进行特定值的定位与查找,从而加快数据查询的效率。
索引就是帮助数据库管理系统高效获取数据的数据结构。
如果我们不使用索引,就必须从第 1 条记录开始扫描,直到把所有的数据表都扫描完,才能找到想要的数据。既然如此,如果我们想要快速查找数据,就只需要创建更多的索引就好了呢?
其实索引不是万能的,在有些情况下使用索引反而会让效率变低
索引的价值是帮我们从海量数据中找到想要的数据,如果数据量少,那么是否使用索引对结果的影响并不大。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过两个实验展示了在数据行数较少的情况下,创建索引并未提升查询效率;而在特殊情况下,如性别字段取值分布极不均匀时,创建索引却能显著提升查询效率。文章还介绍了索引的种类,包括普通索引、唯一索引、主键索引和全文索引,以及聚集索引和非聚集索引的区别。总的来说,索引并非万能,需要根据具体情况进行合理的创建和使用,以达到最佳的查询效率。文章还探讨了联合索引的最左原则,指出了在使用联合索引时需要注意的地方。通过对实验结果的对比和总结,读者可以了解到索引的优劣势以及在不同情况下的使用效果,为其在实际工作中合理使用索引提供了指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(44)

  • 最新
  • 精选
  • DZ
    联合索引的最左原则就是说,索引是一种顺序结构,我们按照什么顺序创建索引,就只能按照这个顺序使用索引,这容易理解。 假设我们有X、Y、Z三个字段,创建联合索引(X, Y, Z),可以理解成,数据库按照不同的权重排列了XYZ,形成了一个新值。 如果把X、Y、Z分别类别成“百分位”、“十分位”和“个位”,则新值XYZ依次排列在索引上。 查询“X=9 AND Y=8 AND Z=7”的过程,就是在一个由小到大排列的数值序列中寻找“987”,可以很快找到。 查询“Y=8 AND Z=7”,就用不上索引了,因为可能存在187、287、387、487...,这样就必须扫描所有数值。 查询“Z=7 AND Y=8 AND X=9”,看上去所有字段都用上了,也可以按照百分位、十分位和个数的逻辑去利用索引,但SQL不会自动识别出联合索引顺序与联合查询的顺序,它会严格地按照字面顺序去套用索引,只要不匹配,就不用。 综上,使用联合索引的时候,字段顺序不能乱,查询字段可以少,但只能从右侧开始减少,不能从左侧。 这就像按顺序查数值,先找高位再找低位(索引扫描),如果先找十分位或者先找个位,那就只能每个数值都看一下(全扫描)。

    作者回复: 这个比喻解释的很形象,另外在这个基础上还需要说明下: 1)SQL条件语句中的字段顺序不重要,因为在逻辑查询优化阶段会自动进行 查询重写。 2)如果我们遇到了范围条件查询,比如<、<=、>、>=、between等。那么范围列后的列就无法使用到索引

    2019-08-03
    10
    64
  • 峻铭
    使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。对这句话我不明白,为什么插入、删除、更新等操作,效率会比非聚集索引低,这三个操作内部都是先进行了查询的,聚集索引属于存储结构的物理索引,查询效率高,自然插入、删除、更新的效率也高啊。实在不解

    作者回复: 聚集索引是面向读取的设计,因为我们的数据会按照聚集索引的大小顺序写入到磁盘,因此聚集索引会存在存储顺序的问题。而我们更新,插入的内容往往都是随机的,这时如果我们还是用聚集索引,所有的记录就需要重新进行排序并重新写入到磁盘中,所以效率相比于非聚集索引可能会降低。 而非聚集索引只是存储索引,我们只需要更新这个索引即可,不需要对所有的记录重新排序。

    2019-09-10
    7
    23
  • Fargo
    老师没讲如何创建索引,可以参考https://www.runoob.com/mysql/mysql-index.html

    作者回复: 多谢分享

    2019-08-09
    2
    20
  • Elliot
    一旦创建了索引,你需要先访问 50 万次索引,然后再访问 5... 这句话还是不太理解,可以再详细解释一下吗?非常感谢

    作者回复: 因为二级索引(辅助索引)并不存储我们想要SELECT的具体数据,因此是通过二级索引想找到主键,然后再通过主键找到具体的数据。这种方式也称之为回表,是因为索引没有对SELECT查询的字段进行完全覆盖。

    2019-09-13
    4
    9
  • 许童童
    使用联合索引时,如果可以使用索引覆盖,那就不用回表,查询性能更好了。

    作者回复: 是的

    2019-08-02
    4
    7
  • “当数据重复度大,比如高于 10% 的时候,也不需要对这个字段使用索引。”,文中还举例到了“性别”字段,这类数据重复度大,不正好适合位图索引吗?

    作者回复: 对 位图索引适合

    2019-11-19
    4
  • 未来的胡先森
    计算机实际是对现实生活的一个抽象,正如索引来自于生活中的字典。

    作者回复: 索引比喻的不错,计算机算是运用数学工具,帮我们自动化解决问题

    2019-08-14
    4
  • Z.CC
    100万条数据是怎么插入的。。。

    作者回复: 我写的存储过程插入的…

    2019-09-10
    2
    3
  • 爱思考的仙人球
    在性别这类重复度高的字段上,oracle可以创建位图索引

    作者回复: 对 bitmap是不错的方式

    2019-10-20
    2
  • Monday
    百度网盘下载真慢,另外请老师提供一个存储过程插入用户表。

    作者回复: 大数据量插入的存储过程,我在专栏里应该有写

    2019-08-11
    2
    2
收起评论
显示
设置
留言
44
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部