【目录】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相关推荐

  1. MySQL数据库与SQL优化

    一.MySQL 数据库与 SQL 优化 1.结构图 二.MySQL 数据库引擎简介 1.ISAM(IndexedSequentialAccessMethod)     ISAM 是一个定义明确且历经时 ...

  2. MySQL进阶之SQL优化

    1.使用 show status like 'Com%';可以查到各种语句执行的次数. Com_select:执行select操作的次数. Com_insert:执行insert的次数 Com_upd ...

  3. mysql 嵌套查询性能_mysql SQL优化之嵌套查询-遁地龙卷风

    (-1) 写在前面 这篇随笔的数据使用的是http://blog.csdn.net/friendan/article/details/8072668#comments里的,里面有一些常见的select ...

  4. [转]Mysql中的SQL优化与执行计划

    From : http://religiose.iteye.com/blog/1685537 一,如何判断SQL的执行效率? 通过explain 关键字分析效率低的SQL执行计划. 比如: expla ...

  5. 学习笔记之-MySql高级之sql优化

    一 Mysql简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. M/SQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据 ...

  6. mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...

    本文中所提到的SQL优化技巧均是基于Mysql 索引 BTree类型 .将从以下几个方面介绍常用的SQL优化技巧: 避免在 WHERE 子句中使用 != 或 <> 操作符. 避免在 WHE ...

  7. mysql limit asc_MySql sql优化之order by desc/asc limit M-阿里云开发者社区

    Order by desc/asc limit M是我在mysql sql优化中经常遇到的一种场景,其优化原理也非常的简单,就是利用索引的有序性,优化器沿着索引的顺序扫描,在扫描到符合条件的M行数据后 ...

  8. 【Mysql】慢SQL优化详解 Mysql案例

    前言 影响查询性能因素 –(定量为同一数据库 且并发 数据量一致)依次是: 机器配置 查询引擎 表设计 索引 SQL语句 什么是慢SQL 比通常执行慢.或者超过最大执行限定时间,通常是500ms 慢S ...

  9. 知数堂郑松华:MySQL 8.0 SQL优化之CTE 、窗口函数的应用

    特邀嘉宾 郑 松 华 知数堂<SQL优化>课程讲师 资深数据库工程师 对SQL优化有独到见解 7年SQL开发和调优经验 于韩国法院数据中心从事数据库技术支持 原SKC&CSheny ...

  10. 今晚直播,你该了解的MySQL 8.0 SQL优化新特性

    周四见   公开课系列 We,知数堂 习惯用实力介绍自己-我们只分享干货 重磅福利来袭 2018年8月9日,20:30-22:00 周四见 不见不散! 郑 松 华 知数堂<SQL优化>课程 ...

最新文章

  1. PHP的cookie与session的使用
  2. 人造肌肉机械臂太逼真引热议,举7kg哑铃“肌肉”清晰可见,网友:《西部世界》...
  3. 二十三、“为天下人谋幸福,才是真正的大事。”(2021.7.9)
  4. IPM: Product 270015453 not scheduled in sales organization
  5. 不会Python爬虫?教你一个通用爬虫思路轻松爬取网页数据,赶紧收藏!!
  6. 【问答集锦】从数据中挖掘宝藏,深度学习赋予机器更多“思想”
  7. 如何在DOS下用TCP/IP协议进行登录Windows 2K?
  8. Kaldi AMI数据集脚本学习1----cmd.sh和path.sh
  9. mysql 局域网_MySQL 局域网授权问题
  10. oracle建表空间、用户
  11. 计算机的科学导论pdf,教材计算机科学导论.PDF
  12. 2019年中科院信工所复试经验帖
  13. 4. gstimxv4l2src.c源码分析
  14. python如何爬有道翻译_python爬取有道翻译
  15. sam卡和sim卡区别_SAM卡概述
  16. python与jay的龙卷风
  17. [kuangbin]专题三 Dancing Links Squiggly Sudoku HDU - 4069【DFS】【精确覆盖】
  18. `include “uvm_macros.svh“引发的思考
  19. 限时游戏开发大赛——Ludum Dare介绍
  20. hadoop103 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)

热门文章

  1. 2021东北四省赛部分题解
  2. 如何将谷歌浏览器设置为默认浏览器
  3. 自我管理 - 希望2015年自己能够做到的几点目标
  4. Selenium例1: Bing搜索
  5. Android app 启动优化
  6. html5 显示k线图,canvas绘图,html5 k线图,股票行情图
  7. Zynga以特别的《CSR Racing 2》系列活动庆祝布加迪110周年
  8. Redis的数据变成backup
  9. MSN机器人 博客助手 for I-Favourite
  10. c语言编写单片机密码锁程序,51单片机密码锁制作的程序和流程图(很详细)