前面已经建立了索引,优化了SQL语句,并将单线程变为多线程并行执行,去重时间由最初的35秒优化为3.5秒,是不是就到此为止呢?吴老师又使用了rocksdb存储引擎替代innodb的方法。这里有必要交代一下命题的背景。这道MySQL数据库优化的题目出自是阿里内部的竞赛题,当然我是听吴老师口述的,真正的题目及其竞赛规则与竞赛环境不甚明确,但有一条是允许自由选择MySQL存储引擎。在实际的生产环境中,几乎没有可能为了单一操作的优化而改变表的存储引擎,因为这样做的代价通常很高。

顺便提一句,据刚刚得到的消息,吴老师在今天结束的决赛中获得了第三名的好成绩(前两名都是数据库内核组的),祝贺!

一、MyRocks简介
        MyRocks是FaceBook开源的MySQL分支。下面链接是一篇阿里系的介绍文章,在此不再赘述。
https://yq.aliyun.com/articles/59415

二、安装配置MyRocks

1. 支持的平台

官方支持OS:
CentOS 6.8
CentOS 7.2.x
经过验证的兼容编译器:
gcc 4.8.1
gcc 4.9.0
gcc 5.4.0
gcc 6.1.0
Clang 3.9.0

2. 安装前准备
(1)安装依赖包

sudo yum install -y cmake gcc-c++ bzip2-devel libaio-devel bison \
zlib-devel snappy-devel
sudo yum install -y gflags-devel readline-devel ncurses-devel \
openssl-devel lz4-devel gdb git

这几个包缺一不可,gflags-devel和lz4-devel在yum中没有安装包,所以要下源码编译安装。

(2)安装gflags

git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build
ccmake ..

之后按下面的提示操作

/*****
- Press 'c' to configure the build system and 'e' to ignore warnings.
- Set CMAKE_INSTALL_PREFIX and other CMake variables and options.
- Continue pressing 'c' until the option 'g' is available.
- Then press 'g' to generate the configuration files for GNU Make.
******/

make
make install

(3)安装lz4

git clone https://github.com/lz4/lz4.git
cd lz4
make
make install

(4)升级gcc

系统自带4.4.7,升级到任一验证过的编译器,这里升级到6.1.0

# 下载源码包并解压
wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2
tar -jxvf  gcc-6.1.0.tar.bz2# 下载编译所需依赖库
cd gcc-6.1.0
./contrib/download_prerequisites
cd ..# 建立编译输出目录
mkdir gcc-build-6.1.0# 进入此目录,执行以下命令,生成makefile文件
cd  gcc-build-6.1.0
../gcc-6.1.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib# 编译,j后面的是核心数,编译速度会比较快
make -j4# 安装
make install# 切换GCC到新版
# 确定新安装的GCC的路径,一般默认在/usr/local/bin下
ls /usr/local/bin | grep gcc
# 添加新GCC到可选项,倒数第三个是名字,倒数第二个参数为新GCC路径,最后一个参数40为优先级,设大一些之后就自动使用新版了
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc-6.1.0 40# 定义环境变量,需要设置,否则在编译MyRocks时会报错
CC='/usr/local/bin/x86_64-pc-linux-gnu-gcc-6.1.0'; export CC;# 确认当前版本已经切换为新版
gcc -v

(5)更新libstdc++

需要更新libstdc++,否则启动mysqld时会报类似“/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found”的错误。

cp /root/gcc-build-6.1.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /usr/lib64/
cd /usr/lib64/
rm -r libstdc++.so.6
ln -s libstdc++.so.6.0.22 libstdc++.so.6
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

查看包含的GLIBCXX结果如图一所示。

图一

3. 编译MyRocks源码

# 下载项目源码
git clone https://github.com/facebook/mysql-5.6.git
cd mysql-5.6
git submodule init
# 调用 git submodule update 用来更新 submodule 信息。
git submodule update# 生成makefile文件
cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_SSL=system \
-DWITH_ZLIB=bundled -DMYSQL_MAINTAINER_MODE=0 -DENABLED_LOCAL_INFILE=1# 编译
make -j8# 安装
make install

4. 运行mtr tests测试

cd mysql-test
./mysql-test-run.pl --mem --async-client --parallel=16 --fast \
--max-test-fail=1000 --retry=0 --force --mysqld=--rocksdb \
--mysqld=--default-storage-engine=rocksdb --mysqld=--skip-innodb \
--mysqld=--default-tmp-storage-engine=MyISAM --suite=rocksdb

三、启动MyRocks
1. 配置my.cnf

[mysqld]
# 指定存储引擎
rocksdb
default-storage-engine=rocksdb
# 禁用innodb
skip-innodb
# 指定临时表使用的存储引擎
default-tmp-storage-engine=MyISAM
# 指定字符集排序规则
collation-server=latin1_bin
# 禁用binlog
skip_log_bin
# 禁用自动提交
autocommit=0# 不做严格的排序规则检查,如果不设置,在varchar字段建立索引时会报错
rocksdb_strict_collation_check=0
# 启用批量数据装载
rocksdb_bulk_load=1
# 指定批次记录数
rocksdb_bulk_load_size=10000
# 允许并行写内存表
rocksdb_allow_concurrent_memtable_write = 1
# 设置写缓冲区大小
rocksdb_db_write_buffer_size = 1G
# 不立即刷新内存缓冲区中的数据
rocksdb_write_disable_wal = 1

Oracle大师Thomas Kyte曾经说过大多数性能问题是设计不当引起的,尽管如此,作为DBA还是可以从数据库系统调整的角度做些有益的工作。上面这些针对rocksdb存储引擎所做的配置对去重实验的性能影响巨大。我从知道rocksdb到本实验才两天时间,谈不上多了解,只是有些直观的感受。例如,rocksdb_write_disable_wal感觉就和innodb_flush_log_at_trx_commit的作用差不多。

2. 使用mysql_install_db初始化数据库

/usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/my.cnf --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

3. 启动mysqld

useradd mysql
chown -R mysql:mysql /usr/local/mysql/data
/usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql &

四、在MyRocks上进行去重测试
1. 建立源表

create table t_source
(
item_id int,
created_time datetime,
modified_time datetime,
item_name varchar(20),
other varchar(20)
);  

2. 建立目标表

create table t_target like t_source; 

3. 建立生成测试数据的存储过程

delimiter //
create procedure sp_generate_data()
begin     set @i := 1;   while @i<=500000 do  set @created_time := date_add('2017-01-01',interval @i second);  set @modified_time := @created_time;  set @item_name := concat('a',@i);  insert into t_source  values (@i,@created_time,@modified_time,@item_name,'other');  set @i:=@i+1;    end while;  commit;    set @last_insert_id := 500000;  insert into t_source  select item_id + @last_insert_id,  created_time,  date_add(modified_time,interval @last_insert_id second),  item_name,  'other'   from t_source;  commit;
end
//
delimiter ;   

4. 生成测试数据

call sp_generate_data(); insert into t_source
select * from t_source where item_id=1;
commit; 

5. 建立索引

create index idx_sort on t_source(created_time,item_name,item_id);
analyze table t_source;  

6. 建立并行执行的存储过程

delimiter //
create procedure sp_unique(i smallint)
begin     set @a:='0000-00-00 00:00:00';  set @b:=' ';  if (i<4) theninsert into t_target  select * from t_source force index (idx_sort)  where created_time >= date_add('2017-01-01',interval (i-1)*125000 second) and created_time < date_add('2017-01-01',interval i*125000 second) and (@a!=created_time or @b!=item_name) and (@a:=created_time) is not null and (@b:=item_name) is not null  order by created_time,item_name;  commit;else insert into t_target  select * from t_source force index (idx_sort)  where created_time >= date_add('2017-01-01',interval (i-1)*125000 second) and created_time <= date_add('2017-01-01',interval i*125000 second) and (@a!=created_time or @b!=item_name) and (@a:=created_time) is not null and (@b:=item_name) is not null  order by created_time,item_name;  commit;end if;
end
// delimiter ;

7. 建立shell脚本文件duplicate_removal.sh

#!/bin/bash
/usr/local/mysql/bin/mysql -vvv test -e "truncate t_target" &>/dev/null
date '+%H:%M.%N'
for y in {1..4}
dosql="call sp_unique($y)"/usr/local/mysql/bin/mysql -vvv test -e "$sql" &>par_sql1_$y.log &
done
wait
date '+%H:%M.%N'

8. 执行去重

chmod 755 duplicate_removal.sh
./duplicate_removal.sh

并行执行的4个过程调用分别用时如图二所示。

图二

可以看到,每个过程的执行时间均在2.4秒,因为是并行执行,总的过程执行时间也小于2.5秒,比innodb速度提高了近三分之一。

参考:
AliOS编译安装MyRocks
Centos升级gcc4.4.7升级gcc4.8手记
解决类似/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found错误
https://github.com/MySQLOnRocksDB/mysql-5.6
https://github.com/facebook/mysql-5.6/wiki/Build-Steps
https://github.com/facebook/mysql-5.6/wiki/Getting-Started-with-MyRocks

将MySQL去重操作优化到极致之三弹连发(三):用rocksdb替代innodb相关推荐

  1. mysql去重操作哪个最快_如何将 MySQL 去重操作优化到极致?| CSDN 博文精选

    作者 | wzy0623 责编 | 屠敏 出品 | CSDN 博客 前言 问题提出 源表t_source结构如下: item_id int, created_time datetime, modifi ...

  2. 如何将 MySQL 去重操作优化到极致?| CSDN 博文精选

    作者 | wzy0623 责编 | 屠敏出品 | CSDN 博客前言 问题提出源表t_source结构如下:item_id int,created_time datetime,modified_tim ...

  3. mysql数据库优化课程---13、mysql基础操作

    mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...

  4. mysql 数值 字符 优化,教你如何进行Mysql数据类型优化

    1. 版本 1)操作系统版本 cat /proc/version Linux version 3.10.0-957.5.1.el7.x86_64 (mockbuild@kbuilder.bsys.ce ...

  5. mysql如何explan优化sql_《MySQL数据库》MySQL 优化SQL(explain)

    前言 如果要写出优质的SQL语句,就需要了解MySQL的存储原理.MySQL是如何分析SQL,如何利用索引查询. Explain 关键字 explain select * from ic_base;  ...

  6. mysql索引及优化

    1.mysql索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引 ...

  7. MySQL 内部执行优化策略总结

    MySQL 内部执行优化策略总结 前言 一.查询优化策略 1. ICP 索引条件下推 2. MRR 多范围读取优化(批量回表) 3. 索引合并 (1) Intersection 合并 (2) Unio ...

  8. MySQL基础: 索引, 优化, 锁

    一. mysql的架构介绍 ​ 从几年前实习开始, 陆陆续续写了好多的markdown笔记, 早期的笔记大多是在B站和一些大牛博客分享而自己整理的笔记, 早期的笔记体系比较清晰,也是我的学习成长路线. ...

  9. MySQL百万数据优化总结 一

    测试的数据库配置 数据库配置阿里云RDS 存储类型 ESSD PL1 云盘 数据库内存 1024 M 数据库类型 MySQL8.0 CPU 1 核 MySQL8.0 中文参考手册:MySQL8.0中文 ...

最新文章

  1. 常用jar包之commons-beanutils使用
  2. findall与match、search区别及小括号的注意事项
  3. 使用word完成毕业论文的所有详细步骤
  4. IDEA如何设置鼠标滚轮调整字体大小
  5. HTML5前端知识分享:Vue入门
  6. 信息掩码游戏地图掩码相关(msk)
  7. 团建之后,我想离职了
  8. 基于c语言的成绩管理系统,基于C语言实现学生成绩管理系统.docx
  9. Activity MQ生产/消费和订阅/发布的区别
  10. windows 下安装redis
  11. PHP面试技巧——什么是职场暗语?
  12. 错位排列递推公式推导
  13. codecademy SQL 编程系列一Introduction
  14. 零基础入门CV之街道字符识别 Task1 赛题理解
  15. 前端框架之bootstrap学习(一)
  16. 苹果icloud登录_如何在Windows电脑上使用苹果iCloud服务?
  17. 关于duilib在Layered Window下绘制文字不正常的BUG
  18. 浅谈这半年的实习感想
  19. 如何装计算机网络驱动,如何安装驱动 电脑驱动的几种安装方法
  20. maya拆完uv,画好贴图后导入,模型上贴图显示混乱

热门文章

  1. 告别2017,码农翻身全年文章精华
  2. hdfs删除文件 java_分布式文件系统HDFS——基础篇
  3. 修改Grub默认启动项
  4. 微信公众号消息接受与回复
  5. C/C++关于#define的那些奇奇怪怪的用法
  6. ps教程:花卉照片处理:简化背景突出主体
  7. 菜鸟的进阶之路--如何高效使用搜索引擎!
  8. 95%置信区间的含义_在一定的置信度下(如95%)请解释置信区间的含义
  9. 如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP?
  10. python更新织梦网站_织梦DEDECMS自动更新首页的办法