CloudNativeEra
  • Introduction
  • 名词解释
  • Computer Science
    • Computer Organization
      • CPU
      • 二进制、电路、加法器、乘法器
      • 编译、链接、装载
      • 存储器
      • IO
    • Operating System
      • 操作系统基础知识
      • 系统初始化
      • 进程管理
      • Everything about Memory
      • 文件系统
      • 并行编程
      • Linux
        • CPU
        • IO 多路复用
        • DMA IO and Linux Zero Copy
    • Computer Network
      • 网络相关命令
      • 评估系统的网络性能
      • 网络抓包
      • Linux 最多支撑的 TCP 连接
      • 网络虚拟化
      • DHCP 工作原理
    • Data Structure and Algorithm
      • 题目列表
      • Summarize
        • 方法总结
        • 二分思想
        • 树的演化
        • 算法思想总结
      • Data Structure
        • Data Struct - Array
        • Tree
        • Heap
        • Hash
        • 字符串
      • Algorithm
        • Sorting Algorithm
        • 查找
        • 贪心算法
        • 动态规划
        • 位运算
      • Practice Topics
        • Data Struct in SDK
        • Topic - Tree
        • Topic - Graph
        • Topic - 滑动窗口
        • 剑指 Offer 题解
    • 并发编程
      • 并发模式
      • 并发模型
  • 系统设计
    • 软件设计
      • 软件架构
      • 编程范式
      • 系统设计题
      • 设计原则
      • 计算机程序的构造和解释 SICP
    • 领域驱动设计
      • 应用:在线请假考勤管理
      • 应用: library
    • 微服务与云原生
      • Designing and deploying microservices
      • 容器技术
      • Docker
      • Etcd
      • Kubernetes
        • Kubernetes - Mapping External Services
      • Istio
      • 监控
    • 分布式系统
      • 分布式理论
      • 分布式事务
    • 后端存储设计
      • 缓存设计
      • 数据库架构设计
    • CI/CD
    • 设计最佳实践
    • 测试
    • 安全
    • 综合
      • 开发实践
      • 分布式锁
      • 分布式计数服务
      • 弹幕系统设计
      • 消息队列设计
      • 分布式ID生成算法
      • 限流设计
      • 网关设计
      • 通用的幂等设计
      • 分布式任务调度
        • Timer
        • ScheduledExecutorService
        • Spring Task
        • Quartz
      • 交易系统
      • 权限设计
  • 编程语言
    • 编程语言
    • C & C++
    • Java
      • JVM
        • JVM Bytecode
      • Java 核心技术
      • Java 8 新特性
      • Java 集合框架
      • Java NIO
      • 并发编程
        • 线程生命周期与线程中断
        • 三个线程交替打印
        • 两个线程交替打印奇偶
        • 优雅终止线程
        • 等待通知机制
        • 万能钥匙:管程
        • 限流器
        • 无锁方案 CAS
    • Java 源码阅读
      • Unsafe
      • 异步计算 Future
      • Java Queue
      • CoalescingRingBuffer 分析
      • Java Collections
        • PriorityQueue 分析
        • HashMap 分析
        • TreeMap
    • Golang
    • Python
  • 框架/组件/类库
    • Guava
      • Guava Cache
      • Guava EventBus
    • RxJava
    • Apache MINA
    • Netty
      • 网络 IO 模型
      • Netty 生产问题
    • Apache Tomcat
    • MyBatis
    • 限流框架
    • Spring Framework
      • Spring Core
      • Spring 事务管理
    • Spring Boot
    • Spring Cloud
      • Feign & OpenFeign
      • Ribbon
      • Eurake
      • Spring Cloud Config
    • FixJ
    • Metrics
    • Vert.x
  • 中间件
    • Redis
      • Redis 基础
        • Redis 数据结构设计与实现
        • Redis 高性能网络模型
      • Redis checklist
      • 应用案例 - Redis 数据结构
      • 应用案例 - Redis 缓存应用
      • 应用案例 - Redis 集群
      • Redis 客户端
      • Redis 生产案例
        • [译] 在 Redis 中存储数亿个简单键值对
    • MySQL
      • MySQL 基础
      • MySQL Index
      • MySQL Transaction
      • MySQL 优化
      • MySQL 内核
      • MySQL Command
      • MySQL Checklist
      • MySQL Analysis Tool
      • 实现 MySQL
    • State Machine
    • 数据库连接池
    • MQ
      • 高性能内存队列 Disruptor
      • Kafka
      • Pulsar
      • RocketMQ
        • Broker 的设计与实现
      • NSQ
  • 实际案例
    • 线上 Case
      • Request Aborted
      • MySQL - Specified key was too long
      • Java 应用 CPU 100% 排查优化
      • 频繁 GC 导致的 Java 服务不响应
      • 导出优化
  • 大数据
    • 流计算
    • Flink
  • 其他
    • 工具
    • 读书
      • 设计数据密集型应用
      • 实现领域驱动设计
      • 精通比特币
      • 提问的智慧
    • 论文
    • 工程博客
    • 阅读源码
    • 面试
      • 如何在最短的时间里对对方有个全面的了解
    • 分享
    • 软技能
    • Todo
  • Blog
    • #算法
      • 查找
      • 位运算
      • 树
    • #架构
      • 1- 通信
    • Design & Dev & Opt
      • High Performance Data structure Design
  • Tiny Project
    • A Simple WeChat-like Instant Messaging Platform
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 中间件
  2. MySQL

MySQL Checklist

可以用作开发过程中的数据库的 Checklist 的实践

关于连接

  • 一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置;可以使用 show processlist 查看相关信息; wait_timeout 参数用来控制某个连接的最大空闲时间;

mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.06 sec)


// 试图使用一个已经断开的连接发送请求,会收到 Lost connection to MySQL server during query.
  • 数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。建立连接的过程通常是比较复杂的,所以在使用中要尽量减少建立连接的动作,也就是尽量使用长连接;一般在客户端会使用数据库连接池。但是有时候也需要注意,MySQL 临时使用的内存是管理在连接的内存对象中的,如果某个连接长期存在,而且做过一些比较大的操作,就会占用比较多的内存,如果这样的连接积累的越多,内存占用的就会越多,有时候还会引起连接异常中断,可以:每过一段时间连接断开后重连,尤其是做个大的操作;另外就是使用 mysql_reset_connection

关于索引

  • 每个表都会有一个主键,当指定主键时就用指定的,没有指定就会找第一个出现的唯一索引,如果不存在唯一索引,会使用一个默认的6字节大小的 _rowid 作为主键

  • limit 优化

// limit 优化
select * from account limit 1000, 10;

上面的 SQL 在执行时,会丢掉扫描数据的前 10000 条记录,返回 10000 ~ 10010 的数据,这样的代价非常高;如何优化?

///// 优化1
select * from account limit 1000, 10;
// 首先是以主键进行排序的,那么每次返回都是有一个最大的id的,比如是 100

// SQL 改写为
select * from account where id > 100 limit 10;
// 最大的id返回 120,那么下次的查询为
select * from account where id > 120 limit 10;

关于隔离级别

  • 隔离级别的设置对当前连接有效,比如 JDBC,每个 Connection 都可以设置自己的事务隔离级别,而不会影响其他的连接;其实也是针对每个 Session 都可以独立设置自己的隔离级别;MySQL 提供了全局的隔离级别配置,在创建连接或者Session时不指定隔离级别,默认就是全局的隔离级别(MySQL 默认 REPEATABLE-READ

  • MySQL 的每个事务都会有一个事务id,事务id是严格自增的,是在事务开启的时候向事务系统申请的;

  • 可重复读的核心是一致性读(consistent read),事务更新数据的时候,只能用当前读;如果当前的记录的行锁被其他事务占用的话,就需要进入锁等待;

  • MySQL 在默认情况下,是使用一致性的非锁定读;只有指定使用一致性的锁定读时才会对记录加锁;然后在不同隔离级别下的一致性非锁定读,其结果是不一样的,对于 READ COMMITED 隔离级别,每次读到的都是当前能够看到的最新的快照(已提交的事务产生的);对于 REPETABLE READ , 读取的是事务启动时创建的一致性视图

关于并发

关于其他

_rowid 是全局共享的,并使用 mutex 锁进行保护,所以在高并发下会引发锁竞争,降低效率,故推荐使用 auto_increment 。auto_increment 是表级别的,不会产生数据库级别的竞争;由于auto_increment的顺序性,减少了随机读的可能,保证了写入的page的缓冲命中。(不可否认,写入的并发足够大时,会产生热点块的争用)

关于 MySQL 使用

当操作符左右两边的数据类型不一致时,会发生隐式转换。
当where查询操作符左边为数值类型时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。
当where查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。
字符串转换为数值类型时,非数字开头的字符串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。
  • rows_examined就是“server层调用引擎取一行的时候”加1

  • 引擎内部自己调用,读取行,不加1

上一页MySQL Command下一页MySQL Analysis Tool

最后更新于4年前

这有帮助吗?

使用 InnoDB 存储引擎强烈推荐使用一个自增主键,如果不指定主键,会自动使用一个自增的整型 _rowid 作为主键( 一般 6 字节,是所有的没有指定主键的表共用的),

,

并发控制
参考这里
MySQL 的隐式类型转换引起的问题总结
另外一篇