牛牛逼逼叉叉
菜单

mysql数据库单机数十亿数据查询设计

2016年06月14日,分类《mysql》,作者:
博客捐助

分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧。

如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据库软件设计复杂的集群关系,也不需要分布式水平分割等太重的优化。

只需要用mysql在本机笔记本搭建一个普通的环境就行。

那么首先是针对mysql做一些普通常见的优化,比如分表分区、建索引、表字段设计以及mysql的配置优化,比如缓冲区大小等等,这类配置我找了一个文章,详细的可以看 http://www.cnblogs.com/Bozh/archive/2013/01/22/2871545.html
。其实mysql水平分表也是数据水平分割的做法。只需要在入库时针对不同的数据库入到不同的表即可,对于比较大的单个库,比如上两亿的单库,这时候就可以把它进行分表放到两个或者三个表,我的做法是单表不超过一亿。

除了这些优化,我优化的核心设计思想是在建立索引和查询代码上面。

很多人在设计社工库的时候,都是把所有要查询的字段都建立索引,而对于数据库来说,查询的数据库数据量越小,那么查询速度越快,另外索引也比较占空间,所以我们在索引上面做做动作,可以节省大量硬盘空间和优化查询速度。

我的做法是只查可能有我想要的数据的表,肯定没有我想要的数据表直接不查询,我不需要查询的字段就不需要建索引,那这样就可以实现一来我查询的量小了,而来少给很多字段建立索引。

举个简单的例子,比如你现有的数据库info中两个表:

1A表和B表。AB表字段一样。AB表都有明文password字段不为空。
2.A表username字段不为空,B表username字段为空。

3.B表email字段不为空,A表email字段为空。

那在这种情况下,就可以针对这两个表做如下的设计:
1.A表和B表password字段都建立索引。
2.A表username字段建立索引,B表username字段不建立索引且默认为空。

3.B表email字段建立索引,A表email字段不建立索引且默认为空。

OK,那么表设计就完成了。

那么我们就可以利用这种表设计减少我们查询的量来优化查询速度。

对于有索引的字段,在mysql数据库information_schema的statistics表里面保存了所有表的索引信息,那么我们就可以利用这个表来过滤掉我们要查询的字段没有建立索引的表。

比如我要查询info库里面邮箱为root@cnseay.com的信息。那么这个查询中我会丢掉A表,因为A表email字段为空,肯定没有我要查询的root@cnseay.com信息。

那么如何过滤掉A表。一条SQL语句即可:

SELECT TABLE_NAME FROM information_schema.statistics WHERE INDEX_NAME!=’PRIMARY’ and table_schema = ‘info’ and COLUMN_NAME=’email’ GROUP BY TABLE_NAME;

利用这条语句,就可以输出info库email字段存在索引的表。然后利用脚本动态拼接union查询语句查询即可。

我的环境是USB3.0 2TB移动硬盘,笔记本win7 i7-4700,8G内存。20亿数据查询速度在1~3秒。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

【上一篇】

linux python版webshell智能查杀程序-SeayFindShell

【下一篇】

wordpress ajax 简单的例子