文章目录

  • MySQL为什么有时候会选错索引
    • 1.MySQL选择索引的依据
      • 1.1 基于主键的成本计算
      • 1.2 对于二级索引+回表方式的成本计算
    • 2.基于索引统计数据的成本计算
      • 2.1 index dive
      • 2.2 Cardinality(基数)属性
      • 2.3 对于超过dive的系统变量的情况
        • 2.3.1 MySQL选错索引后的优化
  • 怎么给字符串字段加索引
    • 1.加索引的两种思路
      • 1.1 不指定长度的索引
      • 1.2 指定长度的前缀索引
      • 1.3 存在的问题
  • 为什么表数据删掉一半,表文件大小不变?
    • 1.空洞
      • 1.1 如何处理空洞
      • 1.2 Online和inplace
      • 1.3 什么情况下会造成重建完表还变大的情况
  • count(*)这么慢,我该怎么办?
    • 1.count(*) 的实现方式
    • 2.为什么InnoDB也不把总行数存起来呢
    • 3.InnoDB对count(*)的优化
    • 4.所以怎么优化才能提高效率呢
      • 4.1 用缓存系统保存计数
      • 4.2 在数据库保存计数
    • 5.基于InnoDB不同的count用法效率
  • order by 是怎么工作的?
    • 使用order by产生排序的情况
      • 1.全字段排序
        • 1.1 完全在内存中完成
        • 1.2 借助磁盘进行排序
      • 2.rowid排序
      • 3.两种排序的对比
    • 2.使用order by但没有进行排序的情况
  • 如何正确的使用随机排序
    • 1.order by rand()
    • 2.磁盘临时表
    • 3.随机排序算法
  • 为什么sql逻辑一样但执行效率却不同
    • 1.前言
    • 2.隐式类型转换
    • 3.隐式字符编码转换
  • 查一行也会很慢?
    • 1.查询长时间不返回
    • 等MDL锁
    • 等flush
    • 等行锁
    • 2.查询慢
  • 幻读问题究极解决方法
    • 1.读操作利用MVCC,写操作加锁
    • 2.读写操作都进行加锁
      • 2.1 语义上的问题
      • 2.2 数据一致性的问题
    • 3.间隙锁(Gap lock)
      • 3.1 间隙锁引入所带来的问题
        • 3.1.1 死锁问题
  • 为什么改一条记录这么多锁?
    • 1.加锁原则
    • 2.根据加锁原则得到的优化
  • MySQL有哪些“饮鸩止渴”提高性能的方法?
    • 1.先处理掉那些占着连接但是不工作的线程。
    • 2.减少连接过程的消耗。
    • 3.慢查询导致的性能问题及解决方法
      • 3.1 索引没有设计好
      • 3.2 SQL 语句没写好
      • 3.3 mysql自己选错了索引
      • 3.4 总结
    • 4.QPS激增问题
    • 5.类似饮鸩止渴的场景
  • binlog
    • WAL
    • 1.binlog写入机制
    • 2.配合redo log的参数设置以优化IO带来的性能瓶颈问题
      • 2.1 优化参考
  • MYSQL是如何保证主备一致的?
    • 1.主备一致的基本原理
    • 2.binlog
      • 2.1 statement格式的binlog
      • 2.2 row格式的binlog
      • 2.3 mixed格式的binlog
      • 2.4 设置推荐
    • 3.循环复制的问题
      • 3.1 循环问题概述
  • MYSQL如何保证高可用
    • 0.MYSQL主从复制(集群)的常见解决方案
    • 1.MYSQL导致主备延迟的原因
      • 1.1 数据同步的关键时间点
      • 1.2 原因
    • 2.优化策略
      • 2.1 可靠性优先策略
      • 2.2 可用性优先策略
      • 2.3 总结
    • 3.备机的并行复制能力演变
      • 3.1 引入mysql复制的两种复制策略
      • 3.2 MySQL 5.6 版本的并行复制策略
      • 3.3 MariaDB 的并行复制策略
      • 3.4 MySQL 5.7 的并行复制策略
      • 3.5 MySQL 5.7.22 的并行复制策略
  • 主库出问题了,从库怎么办
    • 1.主库宕机后的主备切换
      • 1.1 切换流程
      • 1.2 异常解决的替代
    • 2.读写分离的坑
  • 误删数据后除了跑路,还能怎么办?
  • 为什么还有kill不掉的语句?
    • 1.kill的过程
    • 2.出现killed(杀不掉)的两种情况
    • 3.两个客户端的误解
  • 我查这么多数据,会不会把数据库内存打爆?
    • 1.客户端和服务端如何进行查询
  • join语句怎么优化
    • 0.基于回表的优化
    • 1.循环嵌套连接(NLJ)
    • 2.基于块的循环嵌套连接(BNL)
    • 3.hash存储
  • 临时表
    • 1.临时表的特性
    • 2.临时表的应用
    • 3.为什么临时表可以重名
    • 4.临时表和主备复制
    • 4.内部临时表
      • 4.1 什么使用能使用到内部临时表
      • 4.2 总结
  • Memory引擎
    • 1.内存表的数据组织结构
    • 2.hash 索引和 B-Tree 索引
    • 3.为什么线上不推荐你使用Memory
      • 3.1 锁粒度问题
      • 3.2 数据持久化问题
      • 3.3 总结
  • 自增键为什么不是连续的
    • 1.自增键存储在哪里
    • 2.自增值修改机制
      • 3.为什么自增值不连续
        • 3.1 唯一键冲突导致自增值不连续(第一种原因)
        • 3.2 事务回滚导致不连续(第二种原因)
        • 3.3 自增值为什么不能回退
      • 4.自增锁的优化(第三种原因,主要就是自增id申请策略)
  • 不是普通的insert锁为什么这么多
    • 1.insert … select 语句
    • 2.insert循环写入
    • 3.insert唯一键冲突
    • 4.insert into … on duplicate key update
  • 如何快速的复制一张表
    • 1.mysqldump方法
    • 2.导出CSV文件
  • grant之后要跟着flush privileges吗?
    • 1.全局权限
    • 2.库(db)权限
    • 3.表权限和列权限
    • 4.使用flush privileges之前的总结
    • 5.flush privileges 使用场景
  • 要不要使用分区表
    • 1.分区表是什么
      • 1.1 InnoDB分区表的引擎层的行为
      • 1.2 引擎是MyISAM会发生什么
    • 2.手动分表与分区表的区别
      • 2.1 分区策略
      • 2.2 分区表的 server 层行为
    • 3.小结
      • 3.1 分区表的应用场景
  • 关于join的补充、NLJ和BNL的补充、group by和distinct的补充
  • 自增ID用完了怎么办

MySQL为什么有时候会选错索引

1.MySQL选择索引的依据

  • 概述

mysql选择索引无非就是优化器觉得哪一种索引的成本执行低,优化器会从该索引的扫描行数、是否会用到临时表及是否要进行排序来进行综合判断

1.1 基于主键的成本计算

  • 概述

对于主键来说就是计算全表扫描的成本,取决于下面两个方面

  • 聚簇索引占用的页面数
  • 该表中的记录数
  • 该表中的记录数

对于这个数据的获取,mysql使用的是统计数据中的估计值,每个表都会有一些列的统计信息,本选项表示表中的记录条数。对于使用 MyISAM 存储引擎的表来说,该值是准确的,对于使用 InnoDB 存储引擎的表来说,该值是一个估计值。SHOW TABLE STATUS 展示出的 Rows 值

1.2 对于二级索引+回表方式的成本计算

  • 概述

对于这个方式主要取决于

  • 范围区间数量
  • 需要回表的数量:这个会寻找需要回表记录中第一满足这个条件的记录和最后一个满足这个条件的记录(例如一个范围0~100,会找第一个大于0的最左边界,和找第一个满足小于100的最右边界),这两个记录如果位于不同的页面(对于二级索引列在B+树中是连续的),那么就找父结点来计算总共有几页

2.基于索引统计数据的成本计算

2.1 index dive

  • 概述

前面说到的根据左右区别计算回表的数量(记录条数少的时候可以做到精确计算,多的时候只能估算)。 MySQL把这种通过直接访问索引对应的 B+ 树来计算某个范围区间对应的索引记录条数的方式称之为 index dive 。直接利用索引对应的B+树来计算某个范围区间对应的记录条数

  • 局限性

有零星几个单点区间的话,使用 index dive 的方式去计算这些单点区间对应的记录数也不是什么问题,可是你架不住有的孩子憋足了劲往 IN 语句里塞东西呀,我就见过有的同学写的 IN 语句里有20000个参数的

关于极客时间 | MySQL实战45讲的部分总结相关推荐

  1. 极客时间MySQL实战45讲学习笔记

    零:基础 第一讲:基础架构:一条SQL查询语句是如何执行的? MySQL的基本架构示意图 1.MySQL基础架构 大体来说,MySQL可以分为Server层和存储引擎层两部分. Server层包括连接 ...

  2. MySQL实战45讲学习笔记

    文章目录 MySQL实战45讲-学习笔记 01 基础架构:一条SQL查询语句是如何执行的? mysql逻辑架构 连接器 查询缓存 分析器 优化器 执行器 02 日志系统:一条SQL更新语句如何执行 r ...

  3. 《MySQL实战45讲》——学习笔记04-05 “深入浅出索引、最左前缀原则、索引下推优化“

    04 | 深入浅出索引(上) 1. 什么是索引? 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样,书有500页,每页存的都是书的内容,目录可能只有5页,只存了页码:通过目录能快速找到某个主 ...

  4. 《MySQL实战45讲》——学习笔记12 “InnoDB刷脏页的控制策略“

    本篇介绍MYSQL InnoDB的WAL机制带来的小问题--利用WAL技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,但也带来了内存脏页的问题: 脏页会被后台线程自动flush,也会由于数 ...

  5. 《MySQL实战45讲》——学习笔记01-03 “MySQL基本架构、日志系统、事务隔离“

    最近有新闻说"丁奇"炒股失败欠债,赶紧去极客时间买了他的<MySQL 实战 45 讲>以防下架,顺带重新系统的复习下MYSQL相关知识,记录下学习笔记: 本篇介绍: M ...

  6. 【极客时间】《MySQL45讲》学习笔记

    内容来源:开篇词 | 这一次,让我们一起来搞懂MySQL-极客时间 以下是来自网友对课程的知识点的分类总结: 本章内容[本章内容建议阅读时长] 编号|建议阅读时长|文章标题 1. 基础知识[12'] ...

  7. mysql 实战 45讲 学习笔记 基础知识 原理剖析

    MySQL 实战45讲 持续更新中~ 00讲 开篇 我们知道如何写出逻辑正确的SQL语句来实现业务目标,却不确定这个语句是不是最优的 我们听说了一些使用数据库的最佳实践,但是更想了解为什么这么做 我们 ...

  8. MySQL实战45讲——MySQL是怎么保证数据不丢的?

    文章摘抄自林晓斌老师<MySQL实战45讲>.今天这篇文章, 我会继续和你介绍在业务高峰期临时提升性能的方法. 从文章标题"MySQL是怎么保证数据不丢的? ", 你就 ...

  9. 《Mysql实战45讲》学习笔记 1-22

    Mysql <Mysql实战45讲> 1.一条sql查询语句是如何执行的 Server层: 连接器,查询缓存,分析器,优化器,执行器 存储引擎层: 负责数据的存储和提取 (Innodb, ...

最新文章

  1. java指定位置写入_java指定路径写、读文件
  2. 用C语言实现三子棋游戏(附上思路+项目展示+源代码)
  3. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...
  4. AI现在能教你画画了
  5. python打开文件对话框_python实战演练:如何通过对话框打开文件并对文件进行对比...
  6. oracle sql 基础(六):数据控制语言(用户及权限管理)
  7. 程序结构程序设计(三) ——递归及递归举例
  8. C++ String16与const char*及char*与vector相互转换
  9. Win8怎么在桌面显示我的电脑
  10. hash表的一些基本知识
  11. Android 逆向之smali
  12. java驱动打印机,r230打印机驱动-r230打印机驱动 免费版
  13. 网络安全之主动攻击和被动攻击
  14. linux安装mysql出现Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY error: Failed dependencies: libn
  15. 0基础入行,新手该如何学习SEM
  16. 零基础学前端之SEO 基础知识学习--SEO优化学习教程【学习笔记】
  17. 读取本地文件转化成MultipartFile
  18. 30.7.1 通过mysqladmin修改用户密码
  19. 基于Contiki OS的智能led照明:LIFX
  20. 揭秘交换机市场内幕,“准工业级”猫腻你中招了吗?

热门文章

  1. Codeforces 1183E/H Subsequences dp
  2. java 文件头_常用文件的文件头(附JAVA测试类)
  3. tensorflow报错:tensorflow.python.framework.errors_impl.OutOfRangeError:
  4. VMware vRealize Operations Manager Appliance Install
  5. 轻松实现word文档在线编辑
  6. 诸葛亮是刘备最器重的人才么
  7. Witt向量简介 §3.2:Witt向量的环结构概述
  8. php通用图像处理库imagine使用
  9. python之decimal
  10. 【分布式系统篇】链路追踪之Jaeger安装使用入门