搜狐公司北京招聘MySQL DBA

职位名称:数据库工程师(MySQL DBA)
公司名称:搜狐
所属部门:技术部数据库运维和分析组

工作地点:北京
招聘人数:2到3人
职位性质:内部直招

职位描述:

1.MySQL数据库系统的规划、设计和管理;
2.MySQL数据库的性能优化;

MySQL5.6.7-rc index condition pushdown代码解读

对index condition pushdown很感兴趣,并且跟踪代码让自己受益良多,因此就来跟一下相关代码。

看的是mysql5.6.7-rc官方社区版。

 

先说说我对研究MySQL源码的看法:

每个使用MySQL数据库的人都应该看代码吗?不是的,那意味着MySQL数据库的使用门槛太高,几乎不可用;但另一方面,如果看MySQL代码的人多了,意味着有更多的人对MySQL数据库的了解更加深入。能够进一步推动MySQL数据库广泛而恰当地使用,为使用者、相关从业者创造更多的赢利机会和就业机会。

MariaDB数据库5.5.27 HASH JOIN源码解读

MariaDB数据库加入了对HASH JOIN算法的支持,我对HASH JOIN不了解,借此机会学习一下,测试的数据库版本为MariaDB5.5.27。

先是配置文件,这是我为了方便跟踪源码,在windows上建的环境。

 

D:mariadb-5.5.27sqlDebug>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

 

MySQL数据库Filesort过程

看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数据库latin1保存汉字导致不同的汉字被认为“相等”

MySQL数据库中使用何字符集的问题,大多数人能分辨清楚,但是使用字段值比较的校对规则,则很多人容易混淆不清楚,为此介绍一个latin1字符集编码保存,然后设置为不同校对规则的不同之处。

mysql> SELECT NICKNAME FROM user WHERE nickname = '磊飞';


+———-+
| NICKNAME |
+———-+
| 龙飞     |
| 龙飞     |
| 龙飞     |
| 龙飞     |
+———-+
4 rows in set (0.00 sec)

明明不同的汉字被认为是相等的。我们知道mysql的诸多collation有很多结尾是_ci的,表示大小写不敏感。

MySQL数据库用自增ID快速查找未建索引的日期数据

起因是要mysqldump出一个时间段的数据,导入到另一个库中。

mysql> show create table onetable_0G
*************************** 1. row ***************************
Table: onetable_0
Create Table: CREATE TABLE `onetable_0` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`pid` bigint(20) DEFAULT NULL,
`sid` bigint(20) DEFAULT NULL,
`scope` varchar(2000) COLLATE utf8_bin DEFAULT NULL,
`create_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`create_on`),
UNIQUE KEY `scope` (`pid`,`sid`,`create_on`)
) ENGINE=InnoDB AUTO_INCREMENT=155881688 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

MySQL Too many connections

使用MySQL数据库,有一个容易出现的问题——Too many connections。连接数超过max_connections就会报这个错误。MySQL为了在达到最大连接数时也能给DBA有机会操作,SUPER权限的账号能够使用第max_connections + 1个连接。

 

我们知道,由于SUPER权限有很多特权,因此不会把这个权限给予应用的账号。但是,当应用异常或者数据库异常,达到最大连接数的时候,用管理账号登录,有时候仍然会报Too many connections。此时,如果应用不能及时处理,数据库这边就很难办了。