我是如何用2个Unix命令给MariaDB SQL提速的_mariadb

来源:脚本之家  责任编辑:小易  

最近在学习shell编程,可是在《Linux程序设计》指定的网站上下载了源码,使用的时候却一直出问题。提示:”bash:./here1:/bin/sh^M:损坏的解释器:没有该文件或目录。之后用vi编辑器打开文件,发觉每一行的最后有浅蓝色的字符’^M’。才知道了问题所在 其实并没什么奇怪的,出现这种错误的原因是因为Linux和Windows文本文件的行结束标志不同。在Linux中,文本文件用\\n表示回车换行,而Windows用\\r\\n表示回车换行。所以在Linux中使用Windows的文本文件常常会出现错误。为了避免这种错误,Linux提供了两种文本格式相互转化的命令:dos2unix和unix2dos,dos2unix把\\r\\n转化成\\n,unixtodos把\\n转化成\\r\\n。命令dos2unix和unix2dos的使用非常简单,格式为:dos2unix filenamewww.zgxue.com防采集请勿采集本网。

译者 | 薛命灯

(主要用于连接外部的命令控制窗口,window,linux,unix都能使用) 用法简单输入ip就能建起连接。本人专用:http://yunpan.cn/c34IrKyVQHi4I 访问密码 e67d 【概念解释】什么是SSH?SSH的英文全称是Secure

我试图在 MariaDB(MySQL)上运行一个简单的连接查询,但性能简直糟糕透了。下面将介绍我是如何通过两个简单的 Unix 命令,将查询时间从 380 小时降到 12 小时以下的。

我的回答(使用shell脚本): bin/bash a=0#file number for ja-en-zh b=0#file number for ja-en c=0#file number for ja-zh d=0#file number for en-zh i=0#counter digital=\"\"#initial value for

下面就是这个查询,它是 GHTorrent 分析的一部分,我使用了关系在线分析处理框架 simple-rolap 来实现这个分析。

[1].linux/unix中如何用find命令详解 http://www.tongcx.com/node/86 [2].使用 UNIX find 命令的高级技术 http://www.ibm.com/developerworks/cn/aix/library/es-unix-find.html [3].10 Example of find

select distinctproject_commits.project_id,date_format(created_at, ‘%x%v1') as week_commitfrom project_commitsleft join commitson project_commits.commit_id = commits.id;

[说明]:vi 是一个基于行编辑器 ex 上的全屏幕编辑器,可以在vi 中使用 ex,ed的全部命令,vi选项中-wn 指将编辑窗口大小置为n行,-R 为将编辑的文件置为只读模式,vi 工作模式分为命令模式和输入模式,

两个连接字段都有索引。不过,MariaDB 是通过对 project_commits 进行全表扫描和对 commits 进行索引查找来实现连接的。这可以从 EXPLAIN 的输出看出来。

这个是vi的基本使用,可以找个连续两次按Esc键进入命令模式,使用方向键移动到行,若删除此行按两下dd 或删除某个字符,光标移动到字符前端按x, 命令模式下按i/a 输入文字, 最后:wq 保存退出!

这两个表中的记录比较多:project_commits 有 50 亿行记录,commits 有 8.47 亿行记录。服务器的内存比较小,只有 16GB。所以很可能是因为内存放不下那么大的索引,需要读取磁盘,因此严重影响到了性能。从 pmonitor 对临时表的分析结果来看,这个查询已经运行半天了,还需要 373 个小时才能运行完。

/home/mysql/ghtorrent/project_commits#P#p0.MYD 6.68% ETA 373:38:11

在我看来,这个太过分了,因为排序合并连接(sort-merge join)所需的 I/O 时间应该要比预计的执行时间要低一个数量级。我在 dba.stackexchange.com 上寻求帮助,有人给出了一些建议让我尝试,但我没有信心它们能够解决我的问题。我尝试了第一个建议,结果并不乐观。尝试每个建议都需要至少半天的时间,后来,我决定采用一种我认为可以有效解决这个问题的办法。

我将这两个表导出到文件中,使用 Unix 的 join 命令将它们连接在一起,将结果传给 uniq,把重复的行移除掉,然后将结果导回到数据库。导入过程(包括重建索引)从 20:41 开始,到第二天的 9:53 结束。以下是具体操作步骤。

1. 将数据库表导出为文本文件

我先导出连接两个表需要用到的字段,并按照连接字段进行排序。为了确保排序顺序与 Unix 工具的排序顺序兼容,我将字段转换为字符类型。

我将以下 SQL 查询的输出保存到文件 commits_week.txt 中。

select cast(id as char) as cid,date_format(created_at, ‘%x%v1') as week_commitfrom commitsorder by cid;

然后将以下 SQL 查询的输出保存到 project_commits.txt 文件中:

select cast(commit_id as char) as cid, project_idfrom project_commitsorder by cid;

这样就生成了以下两个文件。

-rw-r–r– 1 dds dds 15G Aug 4 21:09 commits_week.txt

-rw-r–r– 1 dds dds 93G Aug 5 00:36 project_commits.txt

为了避免内存不足,我使用 –quick 选项来运行 mysql 客户端,否则客户端会在输出结果之前尝试收集所有的记录。

2. 使用 Unix 命令行工具处理文件

接下来,我使用 Unix 的 join 命令来连接这两个文本文件。这个命令线性扫描两个文件,并将第一个字段相同的记录组合在一起。由于文件中的记录已经排好序,因此整个过程完成得很快,几乎就是 I/O 的速度。我还将连接的结果传给 uniq,用以消除重复记录,这就解决了原始查询中的 distinct 问题。同样,在已经排好序的输出结果上,可以通过简单的线性扫描完成去重。

这是我运行的 Unix 命令。

join commits_week.txt project_commits.txt | uniq >joined_commits.txt

经过一个小时的处理,我得到了想要的结果。

-rw-r–r– 1 dds dds 133G Aug 5 01:40 joined_commits.txt

3. 将文本文件导回数据库

最后,我将文本文件导回数据库。

create table half_life.week_commits_all (project_id INT(11) not null,week_commit CHAR(7)) ENGINE=MyISAM;load data local infile ‘joined_commits.txt'into table half_life.week_commits_allfields terminated by ‘ ‘;

结语

理想情况下,MariaDB 应该支持排序合并连接,并且在预测到备用策略的运行时间过长时,优化器应该使用排序合并连接。但在此之前,使用 70 年代设计的 Unix 命令就可以解决这个问题。

man根据内容进行了分类比如1是命令 3是系统调用等等1M应该也是其中的一个分类手册的各章节内容通常如下规定:(一个手册可以有好几节,比如 man(1)、man(7)等,可分别用 man 1 man、man 7 man来察看。1 命令命令的使用方法,可以使用的参数等。2 系统调用只有系统才能执行的函数3 库调用大多是 libc 函数,如 qsort(3)4 特殊文件文件在/dev 中。文件的格式,比如etc/passwd 及其他可读文件。6 游戏7 宏命令包和约定一些描述,关于标准文件系统设计、网络协议,ASCII 和 其他字符编码、man page(手册页)和其他。8 系统管理命令诸如 mount(8)之类的命令,多数只有 root 可以执行。9 内核程序这个章节几乎不用了。原来曾想把一些关于核心的文件放在这里,但是实际上只有极少数可以写成文件放在这里,而且它们也很快过时了。核心开发者可以找到其他更好的资源内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 浅谈mysql和mariadb区别
  • 在ubuntu系统中安装mariadb数据库的教程
  • windows10系统下安装mariadb 的教程图解
  • mariadb配置双主复制方案
  • mariadb数据库的外键约束实例详解
  • 关于mongoose连接mongodb重复访问报错的解决办法
  • mongodb启动报错 28663 cannot start server
  • mariadb 在低配 vps 上崩溃问题处理方案
  • centos 7下安装mysql(mariadb)的教程
  • centos6.7系统中编译安装mariadb数据库
  • UNIX 命令手册中(1M)是什么意思
  • vim打开文档每行最后都有^M怎么办?使用dos2unix命令转换
  • unix命令2
  • dos2unix命令找不到怎么办
  • 如何运行外部的linux/unix命令/程序
  • 如何用Unix命令统计?
  • 如何使用Unix/Linux find命令
  • 谁能给我一些unix常用命令
  • unix vi 命令
  • 使用UNIX命令如何进入我想要进的文件?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mariadb浅谈mysql和mariadb区别在ubuntu系统中安装mariadb数据库的教程windows10系统下安装mariadb 的教程图解mariadb配置双主复制方案mariadb数据库的外键约束实例详解关于mongoose连接mongodb重复访问报错的解决办法mongodb启动报错 28663 cannot start servermariadb 在低配 vps 上崩溃问题处理方案centos 7下安装mysql(mariadb)的教程centos6.7系统中编译安装mariadb数据库浅谈mysql和mariadb区别centos 7安装mysql5.5和安装 marcentos7 下mysql重新启动mariadbmariadb中1045权限错误导致拒绝用mac中mariadb数据库的安装步骤mysql分支选择参考:percona还是详解centos 使用yum安装mariadbmariadb的主从复制、主主复制、半记一次mariadb数据库无法连接centos安装和设置mariadb的教程关于mongoose连接mongodb重复访问报错的解mariadb配置双主复制方案centos 7中成功安装mariadb的方法教程mariadb的主从复制、主主复制、半同步复制centos7 下mysql重新启动mariadb篇mongodb快速入门笔记(八)之mongodb的javacentos中找回mariadb数据库root用户权限的mariadb 在低配 vps 上崩溃问题处理方案记一次mariadb数据库无法连接mariadb性能调优工具mytop的使用详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved