MySQL DBA's Blog

Archive for March, 2010

session关闭binlog

Wednesday, March 31st, 2010

今天MSN上一个哥们问我,禁止某一个session产生binlog的命令是什么。
我从来没看过有这样的命令,于是就回答他,没有。
后来这个哥们找到了命令,及时反馈了一下。非常感谢他。

A client that has the SUPER privilege can disable binary logging of its own statements by using a SET sql_log_bin=0 statement.

MySQL DBA招聘

Thursday, March 25th, 2010

淘宝网专职MySQL DBA招聘。
工作地点在北京或者杭州。

基本要求:
两年以上MySQL运维经验

有兴趣就投简历到taofang@taobao.com

MySQL分页优化(SQL篇)

Friday, March 5th, 2010

上文提到可以通过去除跳页和限制翻页来减少整个系统的压力。然而PD往往会考虑到用户体验,不愿意去推动这种功能上的删减。
家家有本难念的经,可以理解PD的苦衷。那么作为一个DBA,就只能从SQL上去优化分页的性能了。

假设我们有一个需要分页的表,如下:
CREATE TABLE `test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`b` int(11) NOT NULL,
`c` datetime NOT NULL,
`d` varchar(1000) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_b_c` (`b`,`c`),
KEY `idx_b_id` (`b`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
ID为自增,b为随机数,c为递增的时间,d为长度1000的字符串。往里面插入200w+数据。

典型的分页语句如下:
SQL1:select SQL_NO_CACHE * from test force index(idx_b_c) where b=1 order by c desc limit 2000,10
在六块磁盘做RAID10的情况下,SQL1需要耗费6s以上。explain SQL1可以得到以下结果:
+—-+————-+——-+——+—————+———+———+——-+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+———+———+——-+——+————-+
| 1 | SIMPLE | test | ref | idx_b_c | idx_b_c | 4 | const | 2574 | Using where |
+—-+————-+——-+——+—————+———+———+——-+——+————-+
using where表示MySQL从InnoDB获取了数据之后还要根据条件进行筛选,也就是limit 2000,10那部分。 (more…)

MySQL分页优化(功能篇)

Tuesday, March 2nd, 2010

当数据量大到一定程度的时候,用户往往已经无法一次性查看所有数据,于是就产生了分页需求。
纵观百度、腾讯、网易、淘宝等大型互联网公司的产品,分页之处比比皆是。下面是淘宝的评价页面截图:

说实话,淘宝的分页太过于强大,想怎么查看就怎么查看。不加限制的分页功能,会给系统带来极大的压力和隐患。要优化分页,就必须要舍弃一些华而不实的功能。下面就是造成巨大压力的几个祸首:
1、跳页。用户实际上并不知道在哪一页会出现什么样的内容,也就是说用户无法预期自己跳页后将会获得的数据。从这个角度想,跳页是用户的一种不精确行为。假设某用户查询了2009-01-01到2010-01-01的数据,他在翻了几页之后突然想起需要查看2009-11-11那一天的评价,于是他就使用了跳页功能。跳到差不多的页数后,他再慢慢向前或者向后翻页。
(more…)