Please enable JavaScript.
Coggle requires JavaScript to display documents.
高性能Mysql (架构和索引优化 (索引优化 (索引与锁定 (锁定发生在储存引擎, 索引发生在储存引擎,where 发生在mysql层,…
高性能Mysql
架构和索引优化
架构优化
合适的数据类型
原则:不要过大,够用就好,简单
not null也会好一点
日期的两种类型,长度差别
位集类型
正则化和非正则化
一般是正则的,冗余更新的成本太高,对于不需要数据同步的场合,可以尝试非正则设计。
索引优化
隔离列,不要把列和表达式运算,列上面尽量不用函数
前缀索引,使用前需要先观察测试不同前缀索引的选择性。
覆盖索引(两次查询变一次,更新也可以会增加)
通过索引排序
去除多余和重复索引(通过观察最左前缀来解决)
索引与锁定
锁定发生在储存引擎
索引发生在储存引擎,where 发生在mysql层
正常读不需要锁定,显式锁定时,你实际锁定的范围是索引访问的范围,可能大于利请求的范围。
索引设计技术
把不会范围访问的列尽量发到最左边,概率越高的越左边
MySql的基础架构
客户端
服务器
连接/线程处理器(代理一个客户端线程)
也要处理安全和授权功能
第二层(mysql不包含储存引擎的主要部分)
分析器
解析树
优化器
优化解析树,决定查询读表顺序,使用哪些索引。
请求储存引擎以获得各种开销信息
查询缓存
功能包含,缓存,内建函数,存储过程,触发器,视图
储存引擎
并发控制
读写锁
锁粒度
表锁
行级锁
死锁
死锁检测
超时
利用数学方法
死锁处理
回滚,需要一个方法选择回滚哪个事务。
事务跟并发控制并没与任何关系,重点是ACID
原子性(Atomicity)
一致性(Consistency),一致性一部分是依赖原子性实现的,另一部分依赖逻辑实现,跟更多的是描述结果
隔离性(Isolation)
READ UNCOMMITTED(隔离性为0)
READ COMMITTED(通常理解的隔离性,遗留问题:一个事务2次读同一部分的数据,两次读之间其他事务提交)
REPEATABLE READ(MySql)
串性化
隔离性的分级是有问题的,应该是按隔离效果分而不是按实现方式分(比如最后的串行化)。Mysql的3级别,其实是实现了4级,完整的隔离性。
隔离性和并发控制的关系: 实现了完整的隔离性,很多时候是不用读锁了。
如果用MVVC来实现隔离,需要在事务中所有update时加锁,commit时释放锁。
持久性(Durability)
性能相关概念
基准测试
别人的数据
方法
三方软件,实现了一些标准的测试
mysql自带
sysbench
作用,可以测试硬件,环境,配置对性能的影响
自己的数据
一般通过集成测试实现
性能分析
查询日志
普通日志,log,所有收到的查询(包括没执行的)
慢速查询日志
log-slow-queries = 'file_name'
long_query_time = 2
log-queries-not-using-indexes
分析查询
show status分析
方法
1.flush status;
2.执行sql
3.show session status like 'xxxx'
show profile分析
1.set profile = 1;
2.执行sql
show profiles (查询所有被profiles的查询)
4.show profile for query 2;(第二个查询的profile)
分析操作系统
有哪些进程连接着数据库
1.数据库里面通过 show processlist结果中的host得到ip和端口
2.netstat -ntp | grep :2222 去查询进程
3.netstat -ntp | grep 进程,查看这个进程芙的所有网络连接连接
4.p s | grep 进程 查看这个进程的其他信息