Please enable JavaScript.
Coggle requires JavaScript to display documents.
高性能MySQL (Schema与数据类型优化 p146 (VARCHAR (适合:字符串列的最大长度远大于平均长度;列的更新很少,所以碎片不是问题…
高性能MySQL
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
缓存表/汇总表/Roll-Up Table p168
-
-
-
-
-
-
-
-
-
-
-
步骤
- 客户端发送查询给服务器
- 服务器查看缓存(用查询语句的哈希值进行匹配),结果存在就直接返回
- 未缓存则进行SQL解析/验证,生成解析树
- 预处理验证/鉴权解析树
- 优化器优化查询并比较所有可能的执行计划的代价,选择最优的执行计划,并为每个查询需要的表创建一个handler实例,供优化器获取表/索引的相关信息
- MySQL服务器层根据执行计划调用存储引擎的handler API来执行查询
- 将结果写入缓存并返回客户端
-
-
-
-
-
p258 MySQL中WHERE IN(...) 效率非常低下,尽量避免。因为会将相关的外层表压到子查询中,导致扫描更多数据
可以用WHERE EXISTS()改写,效率更高
-
-
-
-
-
-
-
-
-
-
-
-
-
类型
-
-
-
-
-
-
-
-
插入速度严重依赖于插入顺序,按照主键顺序插入是加载数据到InnoDB表中最快的方法,
否则最好加载完成后OPTIMIZE TABLE重新组织一下表(去除随机插入新数据造成的页分裂造成的碎片)
:!:顺序插入在高并发插入时可能造成大量间隙锁竞争,影响性能,AUTO INCREMENT锁机制也可能带来性能瓶颈
-
-
-
-
优化
将长字符串计算CRC32/FNV64 hash再索引,可以用TRIGGER实现 p184
*别用SHA1和MD5,生成的是string,浪费空间,比较时也慢
-
尽可能扩展已有索引满足多种查询,通过IN(所有可能值)跳过不需要过滤的列且还能使用索引 p218
-
-
-
-
合并多个单列索引
-
当MySQL对多个索引AND时 - 通常意味着需要一个包含多列的索引,而不是多个独立的单列索引
当MySQL对多个索引OR时 - 通常耗费大量CPU内存资源在算法的缓存,排序和合并操作上,尤其当索引选择性不好时
*优化器不会把这些成本计算到查询成本中,使其难以被监控到
-
-
-
-
InnoDB在打开某些INFORMATION_SCHEMA表,或者使用SHOW TABLE STATUS和SHOW INDEX,或MySQL客户端开启自动补全功能的时候都会触发索引统计信息的更新。
:!:服务器的数据量大时会造成严重性能问题,关闭innodb_stats_on_metadata参数避免上述情况,
但必须周期性地ANALYZE TABLE来手动更新索引统计信息,避免信息过时造成糟糕的执行计划
客户端或监控程序触发索引信息采样更新时可能导致大量的锁,给服务器带来很多额外压力, 加长客户端启动时间
-
-
数据导入导出
-
-
配置:my.cnf 中设置 log_bin=“binlog存放路径”,show variables like '%log_bin%' 可以查看,show binary logs 查看binlog文件列表,show master status查看当前binlog状态信息
-
-
查看binlog内容
-
SHOW BINLOG EVENTS IN ‘log_name’ FROM position LIMIT offset, row_count
文件格式 binlog_format
ROW(默认)
仅保存记录被修改细节,不记录当时的context
- 优点:可以保证任何类型的修改都会被记录,加快回放效率
- 缺点:所有改动都被记录,日志量更大(5.6版本支持参数binlog_row_image=minimal可以只记录改动的列,大大减少日志量)
Statement
记录每一条修改数据的SQL statement及其context
- 优点:避免记录每一行数据的变化,大大减少日志量,节约IO提高效率
- 缺点:必须记录context以确保回放正确性。主从复制时存在部分function及stored procedure结果不一致
-
复制
binlog复制
- master将数据变更记录到binlog
- slave连接master,请求指定binlog文件的指定位置之后的日志数据
- master收到slave的请求,负责复制的IO进程会读取并传输相应日志数据及其metadata
- slave的IO进程收到数据后追加到自己的relay-log中(append-only),保存当前binlog文件名和offset以备下次请求
- slave的MySQL进程检测到relay-log更新的内容,解析并执行
通过show slave status查看复制进度
- 看Relay_Master_Log_File 和 Maser_Log_File 是否一样,不一样则落后较多,需要从master获取binlog status判断差距
- 再来看Exec_Master_Log_Pos 和 Read_Master_Log_Pos 的差异,对比SQL线程比IO线程慢了多少个binlog事件
- 可以使用pt_heartbeat工具来监控主备复制的延迟
-
恢复
-
- 查看binlog找到想要执行的文件名和区间的start-position和end-position
- mysqlbinlog --start-position=1847 --stop-position=2585 mysql-bin.000008 > test.sql
- mysql> source /var/lib/mysql/3306/test.sql
-
-
-
-
-
:!:用nullable列做分区时,NULL值的行会被分到第一区。WHERE查询字句总是会搜索这个区,因此大量NULL值会导致查询变慢及第一区过大
*5.5版本后可以用PARTITION BY RANGE COLUMNS(order_date)代替
-
-
-
-
-
架构
-
dbproxy
-
analysing SQL protocol, routing, filtering, CQRS, joining results, sorting, partitioning, etc.
-
dbgroup
-
Master has strong ACID consistency, and replicate updates to Slaves via binlog. Slaves have eventually consistency.
-
agents
-
for monitoring, failover, install, upgrade db etc.
事务Transaction
事务模型
Entity Group
-
strong ACID consistency within the same Entity Group, eventually consistency across multiple Entity Groups. Avoiding distributed transactions
multiple rows in multiple tables that belong to the same entity (primary key, tx, particular user, etc), stored in the same physical DB server
-
-
-
-
-
-
-
-