pt-query-digest是最应该掌握的一个工具。它可以分析MySQL的各种日志,如慢查询日志、generel日志,也可以分析show processlist的输出。配合tcpdump我们还可以对线上数据库流量进行采样,实时监控数据库流量,及时发现性能问题。
基本用法如下,
pt-query-digest /path/to/slow.log > /path/to/keep/report_file
如果你有大量的数据库节点,可以考虑把pt-query-digest的分析报告写入数据库,方便检索和绘图。
输出的报表类似如下,以下截取了报告的部分内容,
# Overall: 565 total, 22 unique, 0.00 QPS, 0.00x concurrency _____________
# Time range: 2012-09-22 18:33:43 to 2012-10-16 10:45:31
# Attribute total min max avg 95% stdde[……]
Read more
阿姆达尔定律是一个计算机科学界的经验法则,因IBM公司计算机架构师吉恩·阿姆达尔而得名。吉恩·阿姆达尔在1967年发表的论文中提出了这个重要定律。
阿姆达尔定律主要用于发现仅仅系统的部分得到改进,整体系统可以得到的最大期望改进。它经常用于并行计算领域,用来预测适用多个处理器时理论上的最大加速比。在我们的性能调优领域,我们利用此定律有助于我们解决或者缓解性能瓶颈问题。
阿姆达尔定律的模型阐释了我们现实生产中串行资源争用时候的现象。如下图模型,一个系统中,不可避免有一些资源必须串行访问,这限制了我们的加速比,即使我们增加了并发数(横轴),但取得效果并不理想,难以获得线性扩展能力(图中直线)。

以下介绍中、系统、算法、程序可以认为都是优化的对象,我不加以区分,它们都有串行的部分和可以并行的部分。
在并行计算中,使用多个处理器的程序的加速比受限制于程序串行部分的执行时间。例如,如果一个程序使用一个CPU核执行需要20小时,其中部分代码只能串行,需要执行1个小时,其他19小时的代码执行可以并行,那么,不考虑有多少CPU可用来并行执行程序,最小执[……]
Read more
如果你有.ibd文件的一个干净的备份,你可以按如下操作从被起源的地方恢复它到MySQL安装中:
- 发出这个ALTER TABLE语句:
2. ALTER TABLE tbl_name DISCARD TABLESPACE;
警告:这个语句删除当前.ibd文件。
- 把备份的.ibd文件放回到恰当的数据库目录。
- 发出这个ALTER TABLE语句:
5. ALTER TABLE tbl_name IMPORT TABLESPACE;
在上下文中,一个.ibd文件干净的备份意为:
ibd文件里没有尚未提交的事务做的修改。
.ibd文件里无未合并的插入混充条目。
净化已经从.ibd文件移除所有已标注删除的索引记录。
mysqld已经把.ibd文件的所有已修改页面从缓冲池刷新到文件。
你可以用下列方法生成一个.ibd文件的干净备份:
- 停止所有来自mysqld服务器的活动,并提交所有事务。
- 等待直至SHOW INNODB STATUS显示在数据库被已经没有激活的事务,并且InnoDB主线程的状态是Waiting fo[……]
Read more
由于MySQL的内存临时表不支持blob,text值,如果包含blob(text)列的查询需要用到临时表,就会使用基于磁盘的临时表,性能将急剧降低。所以编写查询语句,如果没有必要包含blob、text列,就不要也写入查询条件。
可以规避的办法有2种:
q 1.使用SUBSTRING( ) 函数。
q 2. 把临时表存放在基于内存的文件系统. 如linux下的tmpfs 。设置MySQL变量tmpdir ,可以设置多个临时表位置(用分号分割),MySQL将使用轮询方式。
优化办法有。
q 如果必须使用,可以考虑拆分表,把blob,text字段分离到单独的表。
q 如果有许多大字段,可以考虑合并这些字段到一个字段,存储一个大的200kb比存储20个10kb更高效。
q 考虑使用COMPRESS( ),或者在应用层进行压缩,再存储到blob字段中。
注意:如果BLOB列很大,可能需要增大innodb_log_file_size (MySQL错误日志内可能有提示事务日志小了)。
VARCHAR, BLOB和TEXT列,最大行长度稍[……]
Read more
目前MySQL主要支持的几种索引:B树索引(B-tree),哈希索引( hash) ,空间索引Spacial(R-tree),全文索引(full-text)
B树索引介绍,
实际MySQL实现的B+树,它的索引如下图(摘录自high performance MySQL )

以上是一个简单的图,包括了一个节点块,块内包含一定数量的键值(如key1…keyn) 以及它的叶块(leaf pages),页块内的所有值(Val…)按大小顺序排列,各页块用指针进行连接。
实际的系统,根(root)节点到叶块之间可能有多层的节点块(node page),树的深度取决于表的大小.假设一个块内能存放256个元素,那么3层的树可以存储>1千万的元素.由于有这样的一个层次结构,往往经过2、3次的索引查找,就可以定位到记录,可以大大减少磁盘的读取次数。各页块之间有指针连接,那么还可以方便的进行顺序范围查找。
参考:http://zh.wikipedia.org/wiki/B%2B%E6%A0%91
估计查询性能
对小的表,通常能在1次[……]
Read more
我曾经做过研发、也做过系统管理员、也做过Oracle DBA,至今从事MySQL也有7年时间,从一名Oracle DBA转型为一名MySQL DBA,从传统领域到互联网公司,我想分享给读者一些自己心得,成为一名MySQL DBA并不难,MySQL DBA并不神秘,也容易入门,但成为一名高水平的DBA需要时间,希望我的经历能给大家一些启动,希望热爱数据库技术的同学少走弯路。
2008年,在经历了多年的传统行业之后,我因为机缘巧合进入了移动互联网行业。角色也从专职 Oracle DBA 过渡到了Mysql DBA。MySQL当时不太懂,但以前做Oracle DBA的时候也做过一些MySQL的测试,慢慢就熟悉了。互联网公司的MySQL DBA对比传统行业的DBA工作节奏会快些,所需面对和处理的事情也不一样了。传统的行业,许多Oracle DBA会更偏向网络、存储、小机、OS,Oracle自身产品够强大,很解决很多问题 ,但在互联网行业,Mysql DBA会需要更前进一些, 参与系统架构的评审,和研发团队、监控团队、甚至是运营团队、产品团队互动。
如何做一名合格的MySQL DBA[……]
Read more
SELECT tables.table_schema, tables.table_name, tables.table_rows
FROM information_schema.tables
LEFT JOIN (
SELECT table_schema, table_name
FROM information_schema.statistics
GROUP BY table_schema, table_name, index_name
HAVING
SUM(
CASE WHEN non_unique = 0 AND nullable != ‘YES’ THEN 1 ELSE 0 END
) = COUNT(*)
) puks
ON tables.table_schema = puks.table_schema AND tables.table_name = puks.table_name
WHERE puks.table_name IS NULL
AND tables.table_type = ‘BASE[……]
Read more
sysbench oltp 执行了哪些操作
sysbench执行测试的时候的行为我们需了解,我打开gnerel日志验证了下。
1.oltp
初始化数据,如:
CREATE TABLE sbtest8 (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
k INTEGER UNSIGNED DEFAULT ‘0’ NOT NULL,
c CHAR(120) DEFAULT ” NOT NULL,
pad CHAR(60) DEFAULT ” NOT NULL,
PRIMARY KEY (id)
) /*! ENGINE = innodb MAX_ROWS = 1000000 */
9828 Query CREATE INDEX k_8 on sbtest8(k)
进行各种查询,如下,
9830 Query BEGIN
9830 Query SELECT c FROM sbtest1 WHERE id=4969 基于[……]
Read more
数据库性能测试的目的
最近打算做一个数据库开源产品的对比。由于时间有限,所以迟迟没有下手,这里将思考的一些内容放上博客,希望对感兴趣的同学有帮助。
性能指标一般是响应时间和吞吐率,这点不再赘述。
我们可能出于不同的目的进行数据库主机的性能测试,比如,
* 采购服务器,我们可能需要测试不同组合配置下的数据库性能,选取一个性价比更好的方案.
* 对比不同系统参数/数据库参数 配置下的数据库性能
* 对比不同的数据库产品
* 对比数据库不同版本的差异
* 一些新特性的试用,验证
* 一些patch的验证
* 对不不同的OS/文件系统/库的差异。
如果都是成熟的数据库产品,我们很难证明在所有指标上,一个产品完胜另外一个产品,产品的设计哲学往往决定了它的优势和劣势,或者说安全、效率、价格、稳定这些因素往往不可兼得。所以我们测试的目的不是要证明存在一个完美的产品,而是在可以接受一定损失/妥协之下可以接受的一个软硬件配置。
比如,insert的速度慢一些往往无关紧要,如果可以有更高的压缩率,更高好的存储效率的话。[……]
Read more
导出权限的工具.方便制作主从. 因为有时我们不想导出导入mysql库(可能导致兼容性问题)
可以方便对比数据库之间的权限差异.
可以方便回收权限
语法: pt-show-grants [OPTION…] [DSN]
示例:
1. 导出权限:
pt-show-grants u=root,P=3306,S=/tmp/mysql.sock