SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

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

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

索引是万能的吗?

首先我们需要了解什么是索引(Index)。数据库中的索引,就好比一本书的目录,它可以帮我们快速进行特定值的定位与查找,从而加快数据查询的效率。
索引就是帮助数据库管理系统高效获取数据的数据结构。
如果我们不使用索引,就必须从第 1 条记录开始扫描,直到把所有的数据表都扫描完,才能找到想要的数据。既然如此,如果我们想要快速查找数据,就只需要创建更多的索引就好了呢?
其实索引不是万能的,在有些情况下使用索引反而会让效率变低
索引的价值是帮我们从海量数据中找到想要的数据,如果数据量少,那么是否使用索引对结果的影响并不大。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • 老毕
    联合索引的最左原则就是说,索引是一种顺序结构,我们按照什么顺序创建索引,就只能按照这个顺序使用索引,这容易理解。

    假设我们有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
    4
    26
  • Fargo
    老师没讲如何创建索引,可以参考https://www.runoob.com/mysql/mysql-index.html
    2019-08-09
    3
  • 峻铭
    使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。对这句话我不明白,为什么插入、删除、更新等操作,效率会比非聚集索引低,这三个操作内部都是先进行了查询的,聚集索引属于存储结构的物理索引,查询效率高,自然插入、删除、更新的效率也高啊。实在不解

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

    2019-09-10
    1
    2
  • 未来的胡先森
    计算机实际是对现实生活的一个抽象,正如索引来自于生活中的字典。
    2019-08-14
    2
  • 许童童
    使用联合索引时,如果可以使用索引覆盖,那就不用回表,查询性能更好了。
    2019-08-02
    2
    2
  • Elliot
    一旦创建了索引,你需要先访问 50 万次索引,然后再访问 5...

    这句话还是不太理解,可以再详细解释一下吗?非常感谢

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

    2019-09-13
    1
    1
  • 阿锋
    普通索引、唯一索引、主键索引和全文索引,它们对应聚集索引还是非聚集索引?
    2019-08-02
    1
    1
  • 捞鱼的搬砖奇
    sql能同时提供到github上吗
    2019-08-02
    1
  • “当数据重复度大,比如高于 10% 的时候,也不需要对这个字段使用索引。”,文中还举例到了“性别”字段,这类数据重复度大,不正好适合位图索引吗?
    2019-11-19
  • 爱思考的仙人球
    在性别这类重复度高的字段上,oracle可以创建位图索引

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

    2019-10-20
  • 雪飞鸿
    为什么是最左匹配而不是最右匹配

    作者回复: 从左到右的顺序

    2019-09-17
  • 峻铭
    索引的最左原则,可以假设通过联合索引进行检索的过程为一个函数f(X x=0,Y y=0,Z z=0),参数都有默认值,where条件具有联合索引的字段会依次传入函数中,那么可以传入的情况有(X,Y,Z) 或者(X,Y)或者(X)
    2019-09-10
  • Z.CC
    100万条数据是怎么插入的。。。

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

    2019-09-10
    1
  • 扫地僧
    有一个疑惑,文中老师又讲到聚集索引和非聚集索引,我这么理解不知道是不是对的?
    (1)两者是基于物理实现来划分;
    (2)聚集索引我可以简单的理解为主键索引;非聚集索引则是除主键索引以外的其他字段建立的索引,比如一个user表除了id字段的name,deptId等字段;
    (3)非聚集索引只是一个名称,创建索引的方式还是按照基本的方式创建即可。
    2019-08-13
  • Monday
    百度网盘下载真慢,另外请老师提供一个存储过程插入用户表。
    2019-08-11
  • Mq
    老师好,请教个问题,排序后一次取第50000-55000,一次5000,还是分10次每次取500的效率高。我理解的是排序肯定是要对满足条件的行做一次查找,数据如果在内存了应该是要比做10次查询高,如果数据在临时表空间也应该比做10次查询高,不知道我理解的对不。因为最近在做一个大表同步的功能,跟同事有点分歧
    2019-08-03
  • 用0和1改变自己
    课后问题:联合索引的最左原则,只能从最左边开始匹配,比如联合索引为('字段1,字段2,字段3);
    只能从最左边开始匹配就是 WHERE 字段1 = 'value' 或 WHERE 字段1= 'value’AND 字段2 ='value',
    而不能 WHERE 字段2 ='value';
    老师,这样理解,对吗,
    2019-08-02
  • Geek_6cfaa7
    老师好,聚集索引是不是本身不增加存储空间,只是规定表必须按主键顺序存储,这样如果按主键字段内容查找就会很快,非聚集索引就等于单独做了本目录,单独开辟了一个空间,想要查找先要到这个目录里去找,是这个意思吗?不知道理解的对不对,忘老师解答
    2019-08-02
  • nimil
    老师您好,请问下聚集索引叶子节点是直接存储的行数据还是行数据在磁盘的地址呢
    2019-08-02
    3
收起评论
19
返回
顶部