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必知必会
登录|注册

34丨答疑篇:关于索引以及缓冲池的一些解惑

陈旸 2019-08-28
这篇文章是进阶篇的最后一篇,在这一模块中,我主要针对 SQL 运行的底层原理进行了讲解,其中还有很多问题没有回答,我总结了进阶篇中常见的一些问题,希望能对你有所帮助。下面的内容主要包括了索引原则、自适应 Hash、缓冲池机制和存储引擎等。

关于索引(B+ 树索引和 Hash 索引,以及索引原则)

什么是自适应 Hash 索引?

在回答这个问题前,让我们先回顾下 B+ 树索引和 Hash 索引:
因为 B+ 树可以使用到范围查找,同时是按照顺序的方式对数据进行存储,因此很容易对数据进行排序操作,在联合索引中也可以利用部分索引键进行查询。这些情况下,我们都没法使用 Hash 索引,因为 Hash 索引仅能满足(=)(<>)和 IN 查询,不能使用范围查询。此外,Hash 索引还有一个缺陷,数据的存储是没有顺序的,在 ORDER BY 的情况下,使用 Hash 索引还需要对数据重新排序。而对于联合索引的情况,Hash 值是将联合索引键合并后一起来计算的,无法对单独的一个键或者几个索引键进行查询。
MySQL 默认使用 B+ 树作为索引,因为 B+ 树有着 Hash 索引没有的优点,那么为什么还需要自适应 Hash 索引呢?这是因为 Hash 索引在进行数据检索的时候效率非常高,通常只需要 O(1) 的复杂度,也就是一次就可以完成数据的检索。虽然 Hash 索引的使用场景有很多限制,但是优点也很明显,所以 MySQL 提供了一个自适应 Hash 索引的功能(Adaptive Hash Index)。注意,这里的自适应指的是不需要人工来制定,系统会根据情况自动完成。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • 老毕
    ABCD四条语句都会使用索引。

    A: WHERE y=2 AND x>1 AND z=3 -- 使用索引(x,y,z)的x列。

    x是范围列,索引列最多作用于一个范围列,范围列之后的y列和z列无法使用索引。

    B: WHERE y=2 AND x=1 AND z>3 -- 完整使用索引(x,y,z)。

    C: WHERE y=2 AND x=1 AND z=3 -- 完整使用索引(x,y,z)。

    z是范围列,索引可以被使用。

    D: WHERE y>2 AND x=1 AND z=3 -- 使用索引(x,y,z)的x列和y列。

    y是范围列,索引列最多作用于一个范围列,范围列之后的z列无法使用索引。


    感谢老师指正,纠正了我之前的错误理解。
    2019-08-29
    2
    13
  • Hanqiu_Tan
    首先在数据量比较大的前提下,A中x是范围查询最可能做的是全表扫描利用多块读方式,这样效果很好点。B和C应该利用了联合索引(x,y,z)中所有列。D根据最左原则应该利用了联合索引中的x,y列,执行步骤应该是,通过x,y找到rowid,回表,在通过判断z是否等于3,得到结果
    2019-08-28
    4
  • 一步
    利用老师的 hexo 表做了一个实现:
    按照这个顺序 在 `hp_max`, `hp_growth`, `mp_max` 这3个字段上建立联合索引
    上面的 A 情况:
    explain select * from heros where hp_max > 5000 and hp_growth = 181.6 and mp_max = 200;
    是全部扫描,不走索引 type 为 all
    上面的 B 情况:
    explain select * from heros where hp_max = 5000 and hp_growth = 181.6 and mp_max > 200;
    走联合索引, type 为 range
    上面的 C 情况:
    explain select * from heros where hp_max = 5000 and hp_growth = 181.6 and mp_max = 200;
    走联合索引, type 为 ref
    上面的 D 情况:
    explain select * from heros where hp_max = 5000 and hp_growth > 181.6 and mp_max = 200;
    走联合索引, type 为 range
    2019-09-01
    2
  • mickey
    A -> y
    B -> y,x
    C -> y,x,z
    D -> None
    2019-08-28
    1
    1
  • 只有C用了索引,其他的因为条件不是采用=或者in不会进行排序
    2019-11-23
  • Coool
    以heros表为例,进行查询:
    A:explain select * from heros where hp_max > 5000 and hp_growth = 329 and mp_max = 100; -- All

    B:explain select * from heros where hp_max = 5000 and hp_growth = 329 and mp_max > 100; -- range

    C:explain select * from heros where hp_max = 5000 and hp_growth = 329 and mp_max = 100; -- ref

    D:explain select * from heros where hp_max = 5000 and hp_growth > 329 and mp_max = 100; -- range
    2019-10-25
  • NO.9
    A:x
    B:xyz
    C:xyz
    D:xy
    2019-09-07
  • niemo
    联合索引这里是不是要讲下各种数据库之间的where后条件执行的顺序啊?mysql是从左到右,从上到下,oracle是从右到左,从上到下,对吧?
    2019-09-02
  • asdf100
    对于读操作,为什么选择myisam比innobd效率要高?是因为锁的粒度吗?
    2019-08-31
  • asdf100
    Myisam使用的好像是b- 树吧?

    作者回复: 也是使用的B+树

    2019-08-31
    2
  • 渴望飞的哺乳类
    思考题:
    A:全表扫描
    B:使用联合索引(x,y,z)
    C:使用联合索引(x,y,z)
    D:使用联合索引(x,y)
    2019-08-28
  • 许童童
    思考题:
    A.使用联合索引的x部分
    B.使用联合索引的x,y,z部分
    C.使用联合索引的x,y,z部分
    使用联合索引的x,y部分
    2019-08-28
  • Demon.Lee
    所以,我的问题是: 查询缓存的数据是不是来自缓存池?我理解是的。
    2019-08-28
    3
  • humor
    A: x
    B: x,y,z
    C: x,y,z
    D: x,y
    2019-08-28
    1
收起评论
14
返回
顶部