mysql+舒适化_将MySQL去重操作优化到极致之三弹连发(三):用rocksdb替代innodb

2023-11-04

前面已经建立了索引,优化了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)安装gflagsgit 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)安装lz4git 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结果如图一所示。

b8f517bf02c0b9daf6b661a02a551ac3.png

图一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:[email protected]+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) then

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;

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}

do

sql="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个过程调用分别用时如图二所示。

b64e6145c53ff101e44b0d517e851f58.png

图二

原文:http://blog.csdn.net/wzy0623/article/details/54378575

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql+舒适化_将MySQL去重操作优化到极致之三弹连发(三):用rocksdb替代innodb 的相关文章

  • 用循环语句while或for循环编写一个验证登陆的小程序

    要求 当用户名与密码全部正确时提示登陆成功 否则 提示登陆失败 三次验证失败退出系统 while循环 代码如下 import java util Scanner author Administrator public class Text6
  • Springboot中使用ModelMapper对outputdto转entity的坑

    今天在使用ModelMapper对outputdto转entity的时候发现转出来的entity是null的 在用inputdto转entity的时候没出现过这样的问题呢 对比了下inputdto和outputdto并没有什么不一样 可以说
  • 常用的ASCII码值

    常用的ASCII码值 1 什么是ASCII码 ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符 标准ASCII 码也叫基础ASCII码 使用7 位二进制数 剩下的1位二进制为0 来表示所有的大写和小写字
  • 目标检测小白入门(一)——背景、指标、数据集

    一 背景介绍 计算机视觉领域有四大主要任务 分别是图像分类 目标检测 目标跟踪 图像分割 图像分类的目标是将给定的图像进行分类 给图片或视频分配一个类别标签 比如图像中大部分都是气球 还有其他物体 要给这个图片或者视频提供气球的标签 目标检
  • C语言实现GB2312和UTF8之间的编码转换

    C语言实现GB2312和UTF8之间的编码转换 GB2312 GB2312编码适用于汉字处理 汉字通信等系统之间的信息交换 基本集共收入汉字6763个和非汉字图形字符682个 GB2312中对所收汉字进行了 分区 处理 字符集分成94个区
  • CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle

    在资源管理模块中有一个很重要的功能 Asset Bundle 那什么是Asset Bundle 有什么作用 怎么使用 Asset Bundle呢 一 什么是Asset Bundle 有什么作用 在日常游戏开发过程中 为了减少游戏启动时 资源
  • 2020年必学的devops流行工具,你学会了吗?

    2020年必学的devops流行工具 1 Git 2 Docker 3 Selenium 4 Jenkins 5 Ansible 6 puppet 7 Nagios 8 Chef DevOps Development和Operations的
  • 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一 引言 在 第14 10节 Python中使用BeautifulSoup解析http报文 html标签相关属性的访问 和 第14 11节 Python中使用BeautifulSoup解析http报文 使用查找方法快速定位内容 介绍了通过属
  • Python实现文本词频统计算法及完整代码

    Python实现文本词频统计算法及完整代码 Python是一种高级编程语言 广泛应用于数据科学 机器学习等领域 在文本处理方面 Python也有着得天独厚的优势 不仅提供了多种字符串操作函数 而且还可以使用各种开源库来处理文本 本文将介绍一
  • hdu 1043/poj 1077八数码问题 BFS+康托展开求解

    hdu poj include
  • JedisCommands

    import java util List import java util Map import java util Set Common interface for sharded and non sharded Jedis publi
  • 10天学会flutter DAY6 flutter 玩转异步加载

    玩转异步加载 异步支持 1 处理 Future 2 声明异步函数 3 async await 4 处理 Stream 5 isolate机制 6 生成器 7 元数据 异步支持 Dart 代码库中有大量返回 Future 或 Stream 对
  • 用 Pyqt5 制作一个动态水波进度条

    最近做了一个小项目 里面有一个需求需要添加一个动态进度条 进度条的样式就类似于水波来回起伏的那种形状 下面就是最初的展示效果 有一点区别 这里我加了一个进度自动增加的功能 end imag11252323 gif 下面先说一下这个效果的制作
  • OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

    有几个学习图形学不久的同学都问到这个问题 做一阐述 1 关键字的小修改大概由如下两点决定 第一 先考虑一个成本原则 一个关键字的定义是否修改 是由熟练程序员在使用该关键字时的思维成本来决定的 当然 还有一个原则 是由初学者的学习成本来决定的
  • BUUCTF [GWCTF 2019] 我有一个数据库

    BUUCTF GWCTF 2019 我有一个数据库 考点 目录扫描 phpmyadmin 4 8 1 远程文件包含漏洞 CVE 2018 12613 启动环境 应该是为乱码 结合题目名 应该与数据库有关 寻找提示无果 使用dirsearch
  • JavaBean的详细及引用

    1 JavaBean实际是具有统一接口格式的java类 2 JavaBean的组成 属性 Properties 方法 Method 事件 Events 3 一个JavaBean的例子 该例子是用的Simple属性 lt 属性在以后说 gt
  • (数据库-MySQL) Date 函数

    下面的表格列出了 MySQL 中最重要的内建日期函数 函数 描述 NOW 返回当前的日期和时间 CURDATE 返回当前的日期 CURTIME 返回当前的时间 DATE 提取日期或日期 时间表达式的日期部分 EXTRACT 返回日期 时间按
  • 设计模式(单例模式)

    设计模式第二弹 一 应用 1 1 概念 1 2 应用场景 二 实现 2 1 Python实现 一 应用 1 1 概念 单例模式是一种创建型的设计模式 这种设计模式主要的目的是为了让一个类只保留一个实例 1 2 应用场景 如果你需要创建一个数
  • 用微博图片反查上传者信息

    其实微博每一种图片都包含了上传者的信息 只是大家平时都不会去观察或者不知道罢了 我们经常会看见别的网站会有微博的外链缩略图 那么如何通过微博图片查找到其上传者呢 首先第一种方法 使用网站查询只要一张微博图片就可以帮你 查找出上传这张图的主人

随机推荐

  • FPGA等精度测频

    频率测量在电子设计和测量领域中经常用到 因此对频率测量方法的研究在实际工程应用中具有重要意义 常用的频率测量方法有两种 频率测量法 和周期测量法 频率测量法是在时间t内对被测信号的脉冲数N进行计数 然后求出单位时间内的脉冲数 即为被测信号的
  • 《利用开源项目,学习软件开发》内容回顾与作者采访

    本文转载至 http www infoq com cn articles use open source projects learn software develop utm campaign infoq content utm sour
  • P2P网络编程

    1 具体部分代码见百度网盘 2 用C MFC实现P2P和群聊功能的聊天小软件 http blog csdn net stlst article details 44138075
  • Windows 11解决PowerShell因为在此系统上禁止运行脚本。有关详细信息

    Intellij Idea VScode 等开发工具自带程序终端的时候会报出 系统禁止脚本运行的错误 解决 管理员身份运行Windows PowerShell 执行 get ExecutionPolicy 显示Restricted 表示状态
  • 【区块链与密码学】第6-5讲:SM2数字签名算法

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 6 5 SM2数字签名算法 在政府高
  • YOLO v3基于ROS应用记录

    有时候 就要敢于背上超出自己预料的包袱 真的努力后 你会发现自己要比想象的优秀很多 愿在别人眼里算不上梦想的梦想 成真 言归正传 记录下之前在ROS下跑yolov3的历程吧 感觉现在视觉感知领域用yolo的比faster RCNN多很多了
  • BAT、字节大数据与推荐系统实战项目解读

    现在 大数据的概念问世这么多年来 大数据从技术 政策和资本等多个角度已经切入到社会方方面面 未来数据也会成为的经济驱动因素中越来越重要的一部分 对未来而言 大数据的发展将影响到产业 企业和个人 马云也说了 未来最大的资源就是数据 不参与大数
  • Bytetrack 环境配置 &核心代码解析

    前言 可能有讲错和没讲清楚的地方 随时私信我或者评论 感谢斧正 1 构建 Bytetrack 环境 1 1 环境配置 下载资源 并 进入环境 git clone https github com ifzhang ByteTrack git
  • 蓝桥杯:赢球票

    题目链接 目录 题目描述 输入描述 输出描述 输入输出样例 样例1 样例2 题目分析 样例1 样例2 整体思路 AC代码 Java 题目描述 某机构举办球票大奖赛 获奖选手有机会赢得若干张球票 主持人拿出 N 张卡片 上面写着 1 N 的数
  • Activiti6.0学习实践(2)-源码工程构建

    上节对工作流和activiti有了一个基本认识 本节主要目的是构建源码工程 了解如何从git上创建本地的工程 同时对源码有个基本的了解 目录 1 克隆到本地 2 建立远程git库分支 3 导入到工程 4 源码基本结构 5 基于源码启动act
  • c\c++中单冒号(:)和双冒号(::)的用法

    一 单冒号 有些信息在存储时 并不需要占用一个完整的字节 而只需占几个或一个二进制位 例如在存放一个开关量时 只有0和1 两种状态 用一位二进位即可 为了节省存储空间 并使处理简便 C语言又提供了一种数据结构 称为 位域 或 位段 所谓 位
  • win10搭建c语言开发环境

    win10搭建c语言开发环境 在window10上面用MingW搭建编写C语言的环境 1 下载Mingw 下载页面自行搜索 开始安装 安装路径自行选择 2 点击 continue 出现如下图 3 稍微等待一会 出现如下图界面 选择4项 然后
  • QObject::connect: Cannot connect (null)::readyRead() to MainWindow::slot_receivedata()

    QT 信号与槽函数链接编译之后没有问题 但实际运行过程 直接报错退出 后续发现是指针未定义 报错代码 QSerialPort serial 修改后的代码 QSerialPort serial new QSerialPort
  • 使用读写锁pthread_rwlock_t

    使用读写锁 配置读写锁的属性之后 即可初始化读写锁 以下函数用于初始化或销毁读写锁 锁定或解除锁定读写锁或尝试锁定读写锁 下表列出了本节中讨论的用来处理读写锁的函数 表 4 9 处理读写锁的例程 使用读写锁 配置读写锁的属性之后 即可初始化
  • cat命令详解

    命令语法 Usage cat OPTION FILE 使用 cat 选项 文件名 OPTION 可选项 A show all equivalent to vET 相当于 vET 三个选项 b number nonblank number n
  • [leetcode]Validate Binary Search Tree

    解题思路 1 二叉搜索树有一个特点 就是 in order traversal 是一个递增的序列 2 设置一个pre节点 记录前一个访问的node 采用中叙遍历 遍历到的节点跟pre比较val大小 public class Solution
  • Vim/Vi 编辑器,删除总结

    在linux服务器 无法避免和vi编辑打交道 在命令行模式下删除数量少还好 如果删除很多 光靠删除键一点点删除真的是头痛 还好Vim Vi有快捷的命令可以删除多行 范围 删除行 在Vim Vi中删除一行的命令是dd 以下是删除行的步骤说明
  • [剑指offer] JAVA版题解(完整版)

    本文首发于我的个人博客 尾尾部落 序号 题解 牛客 OJ 数据结构类型 03 剑指offer 二维数组中的查找 二维数组中的查找 数组 04 剑指offer 替换空格 替换空格 字符串 05 剑指offer 从尾到头打印链表 从尾到头打印链
  • 通过hive元数据查询hive指定库和表的总条数

    一 整库下 总条数 1 指定库的表总数 查看ods层的总表数 select count TBL NAME from TBLS t left join DBS d on t DB ID d DB ID where d NAME like od
  • mysql+舒适化_将MySQL去重操作优化到极致之三弹连发(三):用rocksdb替代innodb

    前面已经建立了索引 优化了SQL语句 并将单线程变为多线程并行执行 去重时间由最初的35秒优化为3 5秒 是不是就到此为止呢 吴老师又使用了rocksdb存储引擎替代innodb的方法 这里有必要交代一下命题的背景 这道MySQL数据库优化