对MySQL的一些改进想法和实现
-
Upload
lixun-peng -
Category
Documents
-
view
630 -
download
7
Transcript of 对MySQL的一些改进想法和实现
MySQL目前存在的瓶颈• 单查询不能有效利用多核• 单文件不能有效利用多路径• 数据文件扩展全局锁• 事务写日志持有锁太久• 两级 B树锁不能有效并发• 拆分数据无法有效聚合• 误操作数据不能有效闪回• ……
单查询不能有效利用多核• 对某些查询,可以并行处理• 例如: SELECT count(*) FROM table
WHERE col1 BETWEEN a AND b;
• 我们完全可以把 [a,b]区间分成小区间并发:• SELECT count(*) FROM table WHERE col1
BETWEEN a AND x1;• SELECT count(*) FROM table WHERE col1
BETWEEN x1 AND x2;• …• SELECT count(*) FROM table WHERE col1
BETWEEN xn AND b;
单文件不能有效利用多路径• 在 innodb_per_table下,每个表一个独立文件
• 如果没有好的 RAID卡?如果有多个 SSD?……
• 其实 InnoDB的数据结构已经支持单表空间多文件——因为共享表空间就支持多文件!
• 对独立表空间也把 fil_space_t->chain(fil_node_t)用起来
• 如何计算 page和 node_id的对应关系?• 除最后一个文件都必须固定大小• 固定表空间文件数量
事务写日志持有锁太久• 写事务日志整个过程持有 log_sys->mutex
• 有必要吗?• 写日志时已经知道要写的日志有多长。• 因此没有必要
• 如何解决?• 用 log_sys->mutex申请一段可以写日志的空间,释放锁后再写,后面需要提交的事务继续申请后面的位置即可。
两级 B树锁不能有效并发• InnoDB的 B-tree只有两个 Latch,非叶子节点使用 index->latch,叶子节点使用 page->latch。
• 如果 B-Tree要扩展节点,对不起,整个 B-Tree都需要锁定。
• 解决方案:• 利用 B-Link和 IM协议来操作 B-Tree。• 为每层页加锁,而不是整个非叶子节点加锁。
拆分数据无法有效聚合• MySQL最常见的用法?拆分!
• 拆完以后,数据想换个维度分析怎么办?• 现在只能依赖中间件……
• MySQL已经准备好了干嘛不用?所有SlaveIO/SQL相关函数都用Master_info*传递复制信息。
• 为每个函数传递不同的Master_info*即可实现多主!
误操作数据无法有效闪回• 如果 bug不小心损坏了数据怎么办……
• 现在的办法:最近的全备+binlog
• 但是…… binlog里有完整的操作数据啊~为何不用?
• 将 binlog中的 Log_event修改为逆操作类型!从文件尾部向头部执行,逆转操作!
• MySQL也可以像 Oracle一样闪回~
Q&AE-Mail: [email protected]