L13:MySQL - 性能与SQL优化2
【目录】1.MySQL 事务与锁*2.DB 与 SQL 优化*3.常见场景分析*4.总结
一 事务与锁
事务特性 ACID
- Atomicity: 原子性, 一次事务中的操作要么全部成功, 要么全部失败
- Consistency: 一致性, 跨表、跨行、跨事务, 数据库始终保持一致状态
- solation: 隔离性, 可见性, 保护事务不会互相干扰, 包含4种隔离级别
- Durability:, 持久性, 事务提交成功后,不会丢数据。如电源故障, 系统崩溃
InnoDB 引擎:
双写缓冲区、故障恢复、操作系统、 fsync() 、磁盘存储、缓存、 UPS、网络、备份策略 ……
MySQL事务
表级锁
意向锁: 表明事务稍后要进行哪种类型的锁定
- 共享意向锁(IS): 打算在某些行上设置共享锁
- 排他意向锁(IX): 打算对某些行设置排他锁
- Insert 意向锁: Insert 操作设置的间隙锁
其他:自增锁,LOCK TABLES/DDL
行级锁
- 记录锁(Record): 始终锁定索引记录,注意隐藏的聚簇索引;
- 间隙锁(Gap):
- 临键锁(Next-Key): 记录锁+间隙锁的组合; 可“锁定”表中不存在记录
- 谓词锁(Predicat): 空间索引
死锁
- 阻塞与互相等待
- 增删改 - 锁定读
- 死锁检测与自动回滚
- 锁粒度与自动回滚
- 锁粒度与程序设计
MySQL 事务*
事务隔离是数据库的基础特征;
事务隔离级别:
• 读未提交: READ UNCOMMITTED
• 读已提交: READ COMMITTED
• 可重复读: REPEATABLE READ
• 可串行化: SERIALIZABLE
读未提交
- 很少使用
- 不能保证一致性
- 脏读(dirty read) : 使用到从未被确认的数据(例如: 早期版本、回滚)
锁:
- 以非锁定方式执行
- 可能问题:脏读、幻读、不可重复度
读已提交
- 每次查询都会设置和读取自己的新快照。
- 仅支持基于行的 bin-log
- UPDATE 优化: 半一致读(semi-consistent read)
- 不可重复读: 不加锁的情况下, 其他事务 UPDATE 或 DELETE 会对查询结果有影响
- 幻读(Phantom): 加锁后, 不锁定间隙, 其他事务可以 INSERT
锁:
- 锁定索引记录,而不锁定记录之间的间隙
- 可能问题:幻读、不可重复度
可重复读
- InnoDB 的默认隔离级别
- 使用事务第一次读取时创建的快照
- 多版本技术
锁:
- 使用唯一索引的唯一查询条件时, 只锁定查找到的索引记录, 不锁定间隙
- 其他查询条件, 会锁定扫描到的索引范围, 通过间隙锁或临键锁来阻止其他会话在这个范围中插入值
- 可能的问题: InnoDB 不能保证没有幻读, 需要加锁
序列化
最严格的级别,事务串行执行,资源消耗最大
问题回顾:
- 脏读(dirty read) : 使用到从未被确认的数据(例如: 早期版本、回滚)
- 不可重复读: 不加锁的情况下, 其他事务 update 或 delete 会对结果集有影响
- 幻读(Phantom): 加锁之后, 相同的查询语句, 在不同的时间点执行时, 产生不同的结果集
日志
undo log日志
- 保证事务的原子性
- 用处: 事务回滚, 一致性读、崩溃恢复。
- 记录事务回滚时所需的撤消操作
- 一条 INSERT 语句,对应一条 DELETE 的 undo log
- 每个 UPDATE 语句,对应一条相反 UPDATE 的 undo log
保存位置:
- system tablespace (MySQL 5.7默认)
- undo tablespaces (MySQL 8.0默认)
回滚段(rollback segment)
redo log日志
- 确保事务的持久性,防止事务提交后数据未刷新到磁盘就掉电或崩溃。
- 事务执行过程中写入 redo log,记录事务对数据页做了哪些修改。
- 提升性能: WAL(Write-Ahead Logging) 技术, 先写日志, 再写磁盘。
- 日志文件: ib_logfile0, ib_logfile1
- 日志缓冲: innodb_log_buffer_size
- 强刷: fsync()
MVCC:多版本控制
- 使 InnoDB 支持一致性读: READ COMMITTED 和 REPEATABLE READ 。
- 让查询不被阻塞、无需等待被其他事务持有的锁,这种技术手段可以增加并发性能。
- InnoDB 保留被修改行的旧版本。
- 查询正在被其他事务更新的数据时,会读取更新之前的版本。
- 每行数据都存在一个版本号, 每次更新时都更新该版本
- 这种技术在数据库领域的使用并不普遍。 某些数据库, 以及某些 MySQL 存储引擎都不支持
聚簇索引更新 = 替换更新
二级索引更新 = 删除 + 新建
实现机制
- 隐藏列
- 事务链表, 保存还未提交的事务,事务提交则会从链表中摘除
- Read view: 每个 SQL 一个, 包括 rw_trx_ids, low_limit_id, up_limit_id, low_limit_no 等
- 回滚段: 通过 undo log 动态构建旧版本数据
二 DB与SQL优化
1.数据类型的选择,越大越好?
2.数据引擎的选择
3.安全性问题,不能用密码或真实名称去直接查询
4.count() count(1) count(*) 的选择
5.隐式转换,类型转换,关注SQL走不走索引?
6.使用时CPU升高,SQL查询变慢,问题定位与解决思路
定位问题方法:
- 慢查询日志
- 应用与运维监控
7.索引类型
哈希索引
B树 / B+树
B+树 相较于 B树 实际数据存储是在叶子节点,且叶子节点之间通过指针形式链接,以提升局部查询效率
索引思考
为什么不用Hash?
为什么B+树更适合索引?
为什么主键长度不能过大?
8.为什么主键要递增?
页分裂问题:类似于List扩容,自增会减少数据插入时的性能
9.主键和索引查询哪个快?
聚集索引和二级索引
10.字段选择:最左匹配原则
11.修改表结构的危害
索引重建
锁表
抢占资源
主从延时
小结
小结1:写入优化
大批量写入的优化
PreparedStatement 减少 SQL 解析
Multiple Values/Add Batch 减少交互
Load Data,直接导入
索引和约束问题
小结2:数据更新
数据范围更新
注意GAP LOCK问题
导致锁范围扩大
小结3:模糊查询
Like问题
前缀匹配
全文检索
Solr、ES使用
小结4:连接查询
连接查询优化
驱动表选择问题
避免笛卡尔积
小结5:索引失效
索引失效情况汇总
NULL,not,not in,函数等
减少使用or,可以用union代替
大数据量或需要全文检索,可以采用其他框架,如ES等
必要时可以利用force index强制查询走某索引
小结6:查询SQL采用什么设计?
查询数据量和查询次数的平衡
避免不必须的大量重复数据传输
避免使用临时文件排序或临时表
分析类需求,可以用汇总表
三 常见场景分析
怎么实现主键ID
- 自增
- sequence
- 模拟 seq
- UUID
- 时间戳/随机数
- snowflake
高效分页
- 分页:count/pageSize/pageNum, 带条件的查询语句
- 常见实现-分页插件:使用查询 SQL,嵌套一个 count,性能的坑?
- 改进一下1,重写 count
- 大数量级分页的问题,limit 100000,20
- 改进一下2,反序
- 继续改进3,技术向:带 id,
- 继续改进4,需求向:非精确分页
- 所有条件组合? 索引?
乐观锁与悲观锁
select * from xxx for update
update xxx
commit;
意味着什么?
select * from xxx
update xxx where value=oldValue
为什么叫乐观锁
区别与各自优势
四 总结
L13:MySQL - 性能与SQL优化2相关推荐
- MySQL数据库与SQL优化
一.MySQL 数据库与 SQL 优化 1.结构图 二.MySQL 数据库引擎简介 1.ISAM(IndexedSequentialAccessMethod) ISAM 是一个定义明确且历经时 ...
- MySQL进阶之SQL优化
1.使用 show status like 'Com%';可以查到各种语句执行的次数. Com_select:执行select操作的次数. Com_insert:执行insert的次数 Com_upd ...
- mysql 嵌套查询性能_mysql SQL优化之嵌套查询-遁地龙卷风
(-1) 写在前面 这篇随笔的数据使用的是http://blog.csdn.net/friendan/article/details/8072668#comments里的,里面有一些常见的select ...
- [转]Mysql中的SQL优化与执行计划
From : http://religiose.iteye.com/blog/1685537 一,如何判断SQL的执行效率? 通过explain 关键字分析效率低的SQL执行计划. 比如: expla ...
- 学习笔记之-MySql高级之sql优化
一 Mysql简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. M/SQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据 ...
- mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...
本文中所提到的SQL优化技巧均是基于Mysql 索引 BTree类型 .将从以下几个方面介绍常用的SQL优化技巧: 避免在 WHERE 子句中使用 != 或 <> 操作符. 避免在 WHE ...
- mysql limit asc_MySql sql优化之order by desc/asc limit M-阿里云开发者社区
Order by desc/asc limit M是我在mysql sql优化中经常遇到的一种场景,其优化原理也非常的简单,就是利用索引的有序性,优化器沿着索引的顺序扫描,在扫描到符合条件的M行数据后 ...
- 【Mysql】慢SQL优化详解 Mysql案例
前言 影响查询性能因素 –(定量为同一数据库 且并发 数据量一致)依次是: 机器配置 查询引擎 表设计 索引 SQL语句 什么是慢SQL 比通常执行慢.或者超过最大执行限定时间,通常是500ms 慢S ...
- 知数堂郑松华:MySQL 8.0 SQL优化之CTE 、窗口函数的应用
特邀嘉宾 郑 松 华 知数堂<SQL优化>课程讲师 资深数据库工程师 对SQL优化有独到见解 7年SQL开发和调优经验 于韩国法院数据中心从事数据库技术支持 原SKC&CSheny ...
- 今晚直播,你该了解的MySQL 8.0 SQL优化新特性
周四见 公开课系列 We,知数堂 习惯用实力介绍自己-我们只分享干货 重磅福利来袭 2018年8月9日,20:30-22:00 周四见 不见不散! 郑 松 华 知数堂<SQL优化>课程 ...
最新文章
- PHP的cookie与session的使用
- 人造肌肉机械臂太逼真引热议,举7kg哑铃“肌肉”清晰可见,网友:《西部世界》...
- 二十三、“为天下人谋幸福,才是真正的大事。”(2021.7.9)
- IPM: Product 270015453 not scheduled in sales organization
- 不会Python爬虫?教你一个通用爬虫思路轻松爬取网页数据,赶紧收藏!!
- 【问答集锦】从数据中挖掘宝藏,深度学习赋予机器更多“思想”
- 如何在DOS下用TCP/IP协议进行登录Windows 2K?
- Kaldi AMI数据集脚本学习1----cmd.sh和path.sh
- mysql 局域网_MySQL 局域网授权问题
- oracle建表空间、用户
- 计算机的科学导论pdf,教材计算机科学导论.PDF
- 2019年中科院信工所复试经验帖
- 4. gstimxv4l2src.c源码分析
- python如何爬有道翻译_python爬取有道翻译
- sam卡和sim卡区别_SAM卡概述
- python与jay的龙卷风
- [kuangbin]专题三 Dancing Links Squiggly Sudoku HDU - 4069【DFS】【精确覆盖】
- `include “uvm_macros.svh“引发的思考
- 限时游戏开发大赛——Ludum Dare介绍
- hadoop103 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)