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

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

DOS格式文本的换行符是两个: 0x0d 0x0a UNIX格式文本的换行符是一个: 0x0a 所以,DOS格式的文本在Unix下看就多了一个0x0d,在vi下看就是 ^M这个样子。按十进制算,0x0d=13,而M是第13个英文字母。 DOS格式的文本,一般就是在 windows下生成的

译者 | 薛命灯

可以用sed dos转UNIX格式:sed -i 's/^M//g' filename UNIX转dos格式:sed -i 's/$/^M/g' filename ^M的输入方式是 Ctrl + v ,然后Ctrl + M

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

Windows 下使用 '\r\n', Mac OS 下使用 '\r',而 Linux 下使用 '\n'。进行适当的转换就可以去掉这烦人的 ^M 符号。如果你从一台 FTP Server (Windows) 下 download 一个文本文件, 而没有使用 text 传输,就会产生这个问题。进行转换的工具是

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

1:^M是十进制的13,八进制的\015。。。 2:vi 能正确显示”规则”的 Unix 格式文件, 也能正确显示”规则”的 Windows 格式文件,但对包含单独的 “回车符”, 同时成对的 “回车换行符”的不规则文件,将把回车符以 ^M 的形式显示。 如果是规则的WINDOWS

select distinct project_commits.project_id, date_format(created_at, ‘%x%v1') as week_commit from project_commits left join commits on project_commits.commit_id = commits.id;

搜索答案 我要提问 你好!请问能用unix系统运行matlab吗?如何将m文件与matlab结合可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问

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

价格不贵,如果是母的那赚了,公的话也没被坑。价格合理,更何况现在的法斗价格一直在涨。而且法斗都是随着月份增长价格也更贵点。当然超过了2岁也会降价。目前比较流行的奶白色法斗带证2到3月的,公的都是2万到5万。母的都是3万多起步。成年品相成型,好的几十万都有。比如图片上那个法斗,现在炒的特别火的一道筋,现在身价50万以上,它的后代5万一个,刚刚出生15天,预定都是5万一个。所以法斗狗狗,只要带证了就上万了,品相更好的价格没限制。

这两个表中的记录比较多: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 上寻求帮助,有人给出了一些建议让我尝试,但我没有信心它们能够解决我的问题。我尝试了第一个建议,结果并不乐观。尝试每个建议都需要至少半天的时间,后来,我决定采用一种我认为可以有效解决这个问题的办法。

1.《热干面》再怎么排名不分先后,热干面不放首位,便是不像话。武汉的热干面与山西的刀削面、北京炸酱面、四川的担担面、郑州烩面并称我国的五大名面。怎么也吃不厌的热干面,早和武汉融为了一体,是武汉人的情怀。2.《豆皮》武汉豆皮迄今已有六七十年历史了,是武汉传统的小吃,其形方而薄,色金而黄,味香而醉,最初是武汉人逢年过节时特制的节日佳肴,后来成为寻常早点。3.《糊汤粉》和湖南、桂林等地的米粉不一样,糊汤粉是武汉人发明独有的品种。糊汤粉的汤汁用新鲜的鲫鱼熬制,加入用籼稻米磨成浆制米粉,撒上葱花、胡椒、萝卜丁等。既有鱼的鲜香,又有稠稠的胡椒质感,配上饱蘸汤汁的热油条,固体液体的完美搭配,吃起来简直妙不可

我将这两个表导出到文件中,使用 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_commit from commits order by cid;

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

select cast(commit_id as char) as cid, project_id from project_commits order 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_all fields terminated by ‘ ‘;

结语

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

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

vim打开文档每行最后都有^M怎么办?使用dos2unix命令转换

最近在学习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 filename

linux 行尾 ^M 是什么

这和Linux与Windows断行格式有关。DOS (Windows 系统)使用的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 底下,则是仅有 LF ($) 这个断行符号。

在 Linux 底下打开Windows的档案时,由于 DOS 的断行符号是 CRLF ,就会多了一个 ^M 的符号出来。

在这样的情况下,如果是一个 shell script 的程序档案,将可能造成“程序无法执行”的状态~ 因为他会误判程序所下达的指令内容。

可以使用dos2unix来转换:

dos2unix file

请问,unix中ls命令如何显示文件以GB为单位的大小?

可以使用ls -lh命令,该会以使用比较接近文件大小的单位显示文件的大小。

在Linux中显示文件大小的时候,通常的做法是使用"Is -I”,显示的大小是文件的字节大小。

但是,如果文件比较大的话,显示起来不是特别易读,这个时候,可以使用ls -lh,就可以使用比较接近文件大小的单位显示文件的大小,例如:

[root@localhost home]# ls -lh

total 3.2G

-rw-r--r--. 1 root root 774K Jun 24 09:17 h

-rw-r--r--. 1 root root 2.3G Jun 24 09:18 i

-rw-r--r--. 1 root root 839K Jun 24 09:17 j

-rw-r--r--. 1 root root 693K Jun 24 09:17 k

-rw-r--r--. 1 root root 147M Jun 24 09:40 l

扩展资料

ls命令使用“-h"参数时,会根据文件的大小选择显示的单位是“K”、“M"”还是“G”。如果希望指定显示的单位,可以使用--block-size"参数, 如下:

1、以k显示  ls -lh

2、以k显示  ls -l --block-size=k

3、以m显示  ls -l --block-size=m

4、以g显示  ls -l --block-size=g

去除vim ^M符号

有两种情况,会出现打开的文件都显示^M符号:

1. vim被配置为fileformat=unix,而你打开的文件都是dos格式的。unix格式的换行符为0A(ascii码)也就是<LF>,dos格式的换行符为 0D 0A(也就是<CR><LF>),<CR>其实就显示为^M。下面是详细讲解:

DOS, Mac 和Unix格式的文件

回想计算机的史前史,那时的打字机使用两个字符来开始一个新行。

首先是一个字符命令使打印头移回开始位置(回车,<CR>),然后另一个字

符命令控制向前进纸一行(进纸,<LF>).

在计算机诞生之初,存储设备十分昂贵。于是有人就提出没有必要

用两个字符来表示一行的结束。UNIX一族决定只用进纸一个字符<Line

Feed>来表示行尾。来自苹果阵营的人则把回车<CR>作为换行的标

准。MS-DOS(和微软的Windows)仍然决定沿用古老的回车换行<CR><LF>传

统。

这也意味着如果把文件从一个系统移到另一个不同的系统,你就会遇

到与换行相关的问题。Vim编辑器则可以识别这些不同格式的文件。

你可以在'fileformats'选项里指定你希望Vim能自动识别的格式的集

合。下面的这个命令就可以让Vim能自动识别UNIX格式和MS-DOS格式:

:set fileformats=unix,dos

把这句话放在_vimrc中,一般情况就都能OK。

2. 你的文本中既有unix的换行符,又有dos的换行符,那么vim会认为你打开的是unix的,所以,那些dos的换行符就会出现恼人的^M。不过这种情况不常见。办法是:

1)若你的vim版本大于7.1,并想用dos显示和保存,如下语句:

:e ++ff=dos

2)若你的vim版本小于等于7.1,又想把文章按照dos格式显示和保存,如下语句:

:set ff=dos

:%s/\r\+$//e

3)若你的vim版本小于等于7.1,又想把文章按照unix格式显示和保存,如下语句:

:set ff=unix

:%s/\r\+$//e

linux vi ^M 是什么

linux vi ^M表示回车换行。

UNIX/Linux操作系统用的文本换行符与Windows等操作系统用的不同,Windows系统下输入的换行符在UNIX/Linux下不会显示为“换行”,而是显示为 ^M 这个符号。

想了解更多Linux知识可《Linux就该这么学》。

  • 本文相关:
  • mariadb 在低配 vps 上崩溃问题处理方案
  • window7安装mariadb数据库及系统初始化操作分析
  • 详解centos 使用yum安装mariadb
  • centos6.7系统中编译安装mariadb数据库
  • mongodb快速入门笔记(八)之mongodb的java驱动操作代码讲解
  • 在ubuntu系统中安装mariadb数据库的教程
  • 关于mariadb安装问题小记(cmake error at)
  • 浅谈mysql和mariadb区别
  • mac中mariadb数据库的安装步骤
  • mysql/mariadb启动时处于进度条状态导致启动失败的原因及解决办法
  • vim打开文档每行最后都有^M怎么办?使用dos2unix命...
  • linux 行尾 ^M 是什么
  • 请问,unix中ls命令如何显示文件以GB为单位的大小?
  • 去除vim ^M符号
  • linux vi ^M 是什么
  • unix 打开dos文本 有时有^M 有时无 ^M
  • dos2unix命令找不到怎么办
  • 怎样去掉文本文件中烦人的 ^M麻烦告诉我
  • windows与unix的/r/n转换问题
  • 你好!请问能用unix系统运行matlab吗?如何将m文件...
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved