MySQL数据库量化InnoDB group commit的效果
二月 9, 2013 by 丁奇 · 2 Comments
前几天有位开发的同学问了个问题,InnoDB的group commit效果如何?之前说好了回头给看下,结果险些拖过年。
Group commit背景
InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit)。如果设置为1,每次事务提交都至少需要写一次redolog。这对IOPS冲击严重,尤其是在HDD上,直接成为性能瓶颈。
Group commit的基本想法是将多个并发线程对redo的fsync操作合并成1个。具体的过程可以参照这篇。
Group commit的效果
其实效果好不好全看具体场景。这里我们先给出一种直观看结果的方法,然后再举例子分析。
1) 数据
简单表结构 Read more
原创文章,转载请注明: 文章地址MySQL数据库量化InnoDB group commit的效果
MySQL数据库5.6 explain update一个疑似bug
二月 7, 2013 by 丁奇 · 2 Comments
5.6 的新增特性,允许对DML语句做explain。这下大家高兴了,碰到复杂更新语句(且还造成慢查询)要自己手动改成select语句的日子终于到头了。
饶有兴致的试用了一把,总体感觉不错,不过发现一个bug。
复现
| mysql> create table tb(id int primary key , c int); Query OK, 0 rows affected (0.01 sec)mysql> insert into tb values(1,1); Query OK, 1 row affected (0.00 sec)mysql> insert into tb values(2,2); Query OK, 1 row affected (0.00 sec)mysql> explain select * from tb where id=1; +—-+————-+——-+——-+—————+———+———+——-+——+——-+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +—-+————-+——-+——-+—————+———+———+——-+——+——-+ | 1 | SIMPLE | tb | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL | +—-+————-+——-+——-+—————+———+———+——-+——+——-+ 1 row in set (0.00 sec) mysql> explain update tb tb set c=2 where id=1; |
这里我们看到,在explain update的结果中,type=range,并且Extra是Using where。 Read more
原创文章,转载请注明: 文章地址MySQL数据库5.6 explain update一个疑似bug
MySQL数据库的字符集和copy_and_convert 字符集不同导致CPU资源额外消耗
关于copy_and_convert
在对MySQL做业务压力测试的时候,我们在perf结果中发现 copy_and_convert 是一个耗费cpu的操作。这个函数的意思,就是在字符集之间做内容转换。
如果源和目标的字符集相同,就可以直接用memcpy,这显然比做字符集转换(按字节或字长拷贝更快,和节省cpu)
当整个系统是CPU瓶颈时,我们希望能够减少这种cpu消耗。
一次查询涉及的拷贝
如果我们执行一个简单的select语句,会涉及到两部分的内容:metadata和data。MySQL的返回包是能够“自解析”的,也就是说不仅有内容,还有描述信息。这些描述信息我们称为metadata。
在将这两部分信息返回给客户端的时候,就涉及到字符串拷贝,如果源字符集和目标字符集不同,就需要作转换。 Read more
原创文章,转载请注明: 文章地址MySQL数据库的字符集和copy_and_convert 字符集不同导致CPU资源额外消耗
MySQL数据库关于一次导入数据提示的MySQL server has gone away
十二月 13, 2012 by 丁奇 · 2 Comments
背景
这个问题由一个同事问到的一次导入数据引发。一个很常见的操作,将数据从一个表中dump出来,在用mysql < a.sql的方式导入到另一个库的一个表中。
在执行导入的时候,提示 MySQL server has gone away。在追查的时候突然想到会不会是因为max_allowed_packet太小导致的。将max_allowed_packet改大,确实解决了问题。
本文基于在此之后想到的两个问题:
1、 MySQL server has gone away这个提示很不友好,是不是所有的包超过大小都是报这个?
2、 对于出现这种不友好的错误提示,有什么方法定位原因(而不是靠“突然想到”)?
追查1 Read more
原创文章,转载请注明: 文章地址MySQL数据库关于一次导入数据提示的MySQL server has gone away
数据库的堆表与索引组织表的数据存储格式讨论
十一月 15, 2012 by admin · Leave a Comment
数据库的堆表与索引组织表的数据存储格式讨论
汪洋@tiptop(967409) 2012/8/29 21:48:48
InnoDB存储引擎为mysql数据库快速小巧这一特点做的,就是你按有序主键去查找,不要更新主键
汪洋@tiptop(967409) 2012/8/29 21:49:57
二级索引的更新,需要overflow segment的问题在rdbms都避免不了吧
文科@EC(101800844) 2012/8/29 22:03:13
不知道分形索引是如何实现的
汪洋@tiptop(967409) 2012/8/29 22:05:31
oracle数据库实现关系型数据库rdbms的来说:大 全 精 Read more
原创文章,转载请注明: 文章地址数据库的堆表与索引组织表的数据存储格式讨论
MySQL5.6.7-rc index condition pushdown代码解读
十月 23, 2012 by 央掘魔罗 · 4 Comments
对index condition pushdown很感兴趣,并且跟踪代码让自己受益良多,因此就来跟一下相关代码。
看的是mysql5.6.7-rc官方社区版。
先说说我对研究MySQL源码的看法:
每个使用MySQL数据库的人都应该看代码吗?不是的,那意味着MySQL数据库的使用门槛太高,几乎不可用;但另一方面,如果看MySQL代码的人多了,意味着有更多的人对MySQL数据库的了解更加深入。能够进一步推动MySQL数据库广泛而恰当地使用,为使用者、相关从业者创造更多的赢利机会和就业机会。 Read more
原创文章,转载请注明: 文章地址MySQL5.6.7-rc index condition pushdown代码解读
MariaDB数据库5.5.27 HASH JOIN源码解读
十月 18, 2012 by 央掘魔罗 · Leave a Comment
MariaDB数据库加入了对HASH JOIN算法的支持,我对HASH JOIN不了解,借此机会学习一下,测试的数据库版本为MariaDB5.5.27。
先是配置文件,这是我为了方便跟踪源码,在windows上建的环境。
D:\mariadb-5.5.27\sql\Debug>more my.ini [mysqld] innodb_file_per_table optimizer_switch='index_condition_pushdown=on' optimizer_switch='mrr=on' optimizer_switch='mrr_sort_keys=on' optimizer_switch='mrr_cost_based=off' mrr_buffer_size=32M optimizer_switch='join_cache_incremental=on' optimizer_switch='join_cache_hashed=on' optimizer_switch='join_cache_bka=on' join_cache_level=4
原创文章,转载请注明: 文章地址MariaDB数据库5.5.27 HASH JOIN源码解读
MySQL数据库Filesort过程
八月 20, 2012 by 央掘魔罗 · Leave a Comment
看mysql源码的收获
filesort algorithm
- 读取所有需要排序的数据
- 每行数据
- 算法1(original):存储排序key和行指针
- 算法2(modified):存储排序key和select中的字段
- 每次排序sort_buffer_size能容纳的行数,排序结果写入IO_CACHE对象(不妨称为IO1),本次排序结果的位置信息写入另一个IO_CACHE对象(不妨称为IO2);
- IO_CACHE超过64k时写入临时文件
- 当order by有limit n时,只需要把前n条排序结果写入IO_CACHE;
- 排序KEY长度<=20且排序KEY数量在一千和十万之间时使用radixsort,否则使用quicksort
- Merge buffer
- 读取排序结果(算法2直接从临时文件读取结果;算法1从临时文件读取行指针,再从表中读取数据)
原创文章,转载请注明: 文章地址MySQL数据库Filesort过程
MySQL数据库中group by的实现
有同学问到MySQL数据库group by是如何实现,发现可能存在误解,简单说明一下。
示例
| CREATE TABLE `tb` ( `c` int(11) DEFAULT NULL, `d` int(4) DEFAULT NULL, `e` varchar(1000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Insert into tb values(2,20,’b’); Insert into tb values(1,10,’a’); Insert into tb values(2,20,’b’); Insert into tb values(1,10,’a’); Insert into tb values(3,30,’c’); |
查询语句和结果 Read more
原创文章,转载请注明: 文章地址MySQL数据库中group by的实现
MySQL Cluster 与 MongoDB 复制群集分片设计及原理
四月 5, 2012 by 元云 · 5 Comments
分布式数据库计算涉及到分布式事务、数据分布、数据收敛计算等等要求
分布式数据库能实现高安全、高性能、高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Cluster从实现上来分析其中的设计思路,用以抽象我们在设计数据库时,可以引用的部分设计方法,应用于我们的生产系统
首先说说关系及非关系数据库的特征
MySQL的Innodb及Cluster拥有完整的ACID属性
A 原子性 整个事务将作为一个整体,要么完成,要么回滚
C 一致性 事务开始之前和事务结束以后,数据库的完整性限制没有被破坏 Read more
原创文章,转载请注明: 文章地址MySQL Cluster 与 MongoDB 复制群集分片设计及原理
