后端存储实战课
李玥
京东零售计算存储平台部资深架构师
立即订阅
3230 人已学习
课程目录
已更新 14 讲 / 共 26 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | 从今天起,换种方式学存储
免费
课前加餐 | 电商系统是如何设计的?
创业篇 (7讲)
01 | 创建和更新订单时,如何保证数据准确无误?
02 | 流量大、数据多的商品详情页系统该如何设计?
03 | 复杂而又重要的购物车系统,应该如何设计?
04 | 事务:账户余额总是对不上账,怎么办?
05 | 分布式事务:如何保证多个系统间的数据是一致的?
06 | 如何用Elasticsearch构建商品搜索系统?
07|MySQL HA:如何将“删库跑路”的损失降到最低?
高速增长篇 (5讲)
08 | 一个几乎每个系统必踩的坑儿:访问数据库超时
09 | 怎么能避免写出慢SQL?
10 | 走进黑盒:SQL是如何在数据库中执行的?
11 | MySQL如何应对高并发(一):使用缓存保护MySQL
12 | MySQL如何应对高并发(二):读写分离
后端存储实战课
登录|注册

10 | 走进黑盒:SQL是如何在数据库中执行的?

李玥 2020-03-19
你好,我是李玥。
上一节课我们讲了怎么来避免写出慢 SQL,课后我给你留了一道思考题:在下面这两个 SQL 中,为什么第一个 SQL 在执行的时候无法命中索引呢?
SELECT * FROM user WHERE left(department_code, 5) = '00028';
SELECT * FROM user WHERE department_code LIKE '00028%';
原因是,这个 SQL 的 WHERE 条件中对 department_code 这个列做了一个 left 截取的计算,对于表中的每一条数据,都得先做截取计算,然后判断截取后的值,所以不得不做全表扫描。你在写 SQL 的时候,尽量不要在 WEHER 条件中,对列做任何计算。
到这里这个问题就结束了么?那我再给你提一个问题,这两个 SQL 中的 WHERE 条件,虽然写法不一样,但它俩的语义不就是一样的么?是不是都可以解释成:department_code 这一列前 5 个字符是 00028?从语义上来说,没有任何不同是吧?所以,它们的查询结果也是完全一样的。那凭什么第一条 SQL 就得全表扫描,第二条 SQL 就可以命中索引?
对于我们日常编写 SQL 的一些优化方法,比如说我刚刚讲的:“尽量不要在 WEHER 条件中,对列做计算”,很多同学只是知道这些方法,但是却不知道,为什么按照这些方法写出来的 SQL 就快?
要回答这些问题,需要了解一些数据库的实现原理。对很多开发者来说,数据库就是个黑盒子,你会写 SQL,会用数据库,但不知道盒子里面到底是怎么一回事儿,这样你只能机械地去记住别人告诉你的那些优化规则,却不知道为什么要遵循这些规则,也就谈不上灵活运用。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《后端存储实战课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 李鑫
    老师好,看了你的课程 感觉有点浅,比如这一篇只是简单介绍了下索引和数据的底层存储结构。像页分裂这些更加底层的没有讲到,建议老师后续的课程可以由浅入深。
    2020-03-19
    5
  • 一步
    MySQL 的执行计划是如何进行查看的?
    2020-03-19
    1
    1
  • 大叶枫
    建议配合实际工作场景得问题,逐步深入的来解执行计划的实战用途。
    2020-03-19
    1
  • Simon
    文中说: 每一行数据直接就保存在 B+ 树的叶子节点上
    这句话可能会有误会,
    实际上B+树的节点存的是"页", 而具体的数据在页里面
    2020-03-19
    1
  • 刘楠
    看了下mysql还是有点蒙,慢慢理解了
    2020-03-20
  • 小袁
    如何结合文章理解小表驱动还是大表驱动呢?我还是想不清楚。
    2020-03-19
    1
  • 基本上就是一个提供了命令式的语言,用户告诉告诉数据库做什么东西就行。没有sql 就一般在存储层简单封装了一层对外的接口,而这层接口就和存储模型有很大关系,比如hbase ,redis 都是健值存储,所以对外主要操作就是get put 等等。
    2020-03-19
  • 一步
    存储引擎再执行执行计划的的时候,是把整个执行计划执行完成后把数据返给执行器,还是每执行一条执行计划获取数据就返给执行器,然后执行器在做运算的?
    个人认为是整个执行计划执行完成后获得最终的数据在返给执行器,但是这个有没有办法去验证的?

    作者回复: 一般都是在存储引擎直接执行的。

    2020-03-19
  • 南山
    很赞同为什么要了解原理的原因,只有知道原理以及内部执行逻辑,遇到问题才能不会像无头苍蝇一样靠运气和蒙。
    2020-03-19
收起评论
9
返回
顶部