注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.7

我将骄傲的活在这个大唐盛世

 
 
 

日志

 
 

海量数据时MySQL的表现  

2012-12-24 18:05:28|  分类: 挨踢咋活 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

当MySQL面对千军万马的时候,表现如何呢?

一.数据库的文件类型

先说说故事的结尾。这个数据库弄完后,很有可能是整个都给别人的。给别人的方式很多,下面的导入导出就是干这件事的。不过最简单的,很显然还是把数据库文件复制给别人就完事。这就引出了“共享空间”和“独享空间”的概念。

所谓“共享空间”,就是所有的数据库在一个数据库文件中;这样乱七八糟的,很显然不能满足这个目的。所谓“独享空间”,就是每个数据库都有自己的地盘------就是目录,两个数据库之间井水不犯河水;而且每个表都有自己的存储文件,两个表之间也没有关系。这是现在我想要的。

共享空间的好处是:这个共享文件支持分块,可以无限大下去;每个放到这个共享文件中的表文件也可以无限大下去了。为什么独享空间的表文件不也做成这样呢?那是因为,为每个表文件搞成这样,开销很大。为什么开销很大呢?那是因为......哎,别追问了。


具体的数据库文件名,实际上与文件的存储引擎有关。不同的存储引擎,公共的部分是frm后缀的,这个是表的逻辑上描述。不同部分的是数据文件、索引文件。如果你看到的是ibd,那说明使用的是innodb存储引擎;该模式下数据文件和索引文件放在一起。

二.数据的导入导出

其实故事的开头是这样的:有一批上千万的文本文件数据,当然用数据库来管理是更好的。第一步就是要导入到数据库。

导入数据库有很多种方式,但是当面对上千万数据时,速度才是最想要的。SQL可以导,但是速度太慢。load data infile "curfilename" into table .......这个速度最快,但是好像必须要在服务器上运行。

当然有工具可以辅助实现,例如Navicate。不过在导入的时候,对于日期时间,所谓的日期格式,就是2012-12-23中的-;2012/12/23中的/。而时间就是13:34:57中的:。此外,要看行与行之间是通过什么分隔。CRLF、CR还是LF。最后,如果文本用引号区分,这个选项也要注意。

总之,弄一个让人放心的文本文件,让别人可以一次性入库,建议这样:1)字段之间都用英文逗号分隔 2)不要有引号3)行与行之间用回车 4)每个字段中不要出现回车换行,逗号,引号等。

在这件事中可是真正折腾了好久。

三.索引,速度之本

当千万数据入库后,查询检索。这时速度简直让人不能忍受了。count都很慢;查询也是遍历一遍。解决之道就是建索引。MySQL的索引也有好几种。简单的很容易想到:索引就是排序,所以无重复的就是主键索引,有重复的就是普通索引。当有了复合索引时,通过复合索引进行查询就得注意了。

四.另外一些让你可能会忽略的细节

千万数据,改一个字段名都会很慢;因为后台会把数据备份然后再往新的表中导入。

MySQL的SQL注释是什么呢? --空格。对,三个前缀,千万别忘了空格。

在MySQL命令行下,运行OPTIMIZE TABLE tablename即可压缩表。大概是因为删除文件没有实际干掉吧。

  评论这张
 
阅读(655)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018