数据库优化: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秒。

时间: 2024-07-28 22:30:28

数据库优化:mysql数据库单机数十亿数据查询设计的相关文章

涂鸦科技:支撑从零暴增数十亿数据的背后,竟无专职运维!

直播视频 (点击图片查看视频) 幻灯下载地址: https://oss.aliyuncs.com/yqfiles/76d3bb80d4a9da17ababada8f56ecd8b.pdf 3月23日在线实时分享顺利结束,本次由涂鸦科技技术总监柯都敏分享了涂鸦科技云上架构设计和借助阿里云实现轻运维高可用性监控的实战经验,同时也介绍了网络安全.权限控制等特定场景下如何利用阿里云产品解决特定的问题题.本次视频直播的整理文章.视频.幻灯片整理完毕,如下内容. 架构演变历程 初创公司的团队刚起步时一般规模

优化mysql数据库的方法

优化mysql数据库的方法 在一个数据库中创建大量的表,那么执行打开,关闭,创建(表)的操作就会很慢. 2:mysql使用内存 a: 关键字缓存区(key_buffer_size)由所有线程共享 b: 每个连接使用一些特定的线程空间.一个栈(默认为64k,变量thread_stack),一个连接缓冲区(变量net_buffer_length)和一个结果缓冲区(net_buffer_length).特定情况下,连接缓冲区和结果缓冲区被动态扩大到max_allowed_packet. c:所有线程共

优化MySQL数据库查询

优化MySQL数据库查询 最简单且最安全的格式,它是磁盘格式中最快的.速度来自于数据能在磁盘上被找到的难易程度.当锁定有一个索引和静态格式的东西是,它很简单,只是行长度乘以数量.而且在扫描一张表时,每次用磁盘读取来读入常数个记录是很容易的.安全性来源于如果当写入一个静态myisam文件时导致计算机down掉,myisamchk很容易指出每行在哪里开始和结束,因此,它通常能收回所有记录,除了部分被写入的记录.在mysql中所有索引总能被重建 1.2动态myisam 这种格式每一行必须有一个头说明它

数十亿背后的红包硬实力比拼

当你紧握手机"摇一摇"抢红包时,目不转睛的不止是你自己.千里之外,还有一批"数据控"盯着电视屏幕,监测着红包发放的实时数据. 数十亿红包,如何扛住数千亿量级的数据洪流?这背后是微信与支付宝红包大战的硬实力比拼. 时间拨回到除夕夜"总决赛",当晚22时30分,微信"摇一摇"抢红包迎来最为紧张的时刻:在广州TIT创意园3号楼和腾大17楼,微信后台运营团队目不转晴地盯着电视屏幕,一边看着春晚实况,一边监控后台数据:央视春晚送红包互动

如何做到“恰好一次”地传递数十亿条消息

在分布式领域中存在着三种类型的消息投递语义,分别是:最多一次(at-most-once).至少一次(at-least-once)和恰好一次(exactly-once).本文作者介绍了一个利用Kafka和RocksDB来构建的"恰好一次"消息去重系统的实现原理. 对任何一个数据流水线的唯一要求就是不能丢失数据.数据通常可以被延迟或重新排序,但不能丢失. 为了满足这一要求,大多数的分布式系统都能够保证"至少一次"的投递消息技术.实现"至少一次"的投递

权威详解 | 阿里新一代实时计算引擎 Blink,每秒支持数十亿次计算

作者介绍 王峰,淘宝花名"莫问",2006年毕业后即加入阿里巴巴集团,长期从事搜索和大数据基础技术研发工作,目前在计算平台事业部,负责实时计算北京研发团队. 在阿里巴巴的11年工作期间,持续专注大数据计算与存储技术领域,基于Hadoop开源生态打造的数据基础设施一直服务于搜索.推荐等阿里核心电商业务场景,最近一年带领团队对Apache Flink进行了大量架构改进.功能完善和性能提升,打造出了阿里新一代实时计算引擎: Blink.目前数千台规模的Blink生产集群已经开始在线支持搜索.

互联网公司如何使用数十亿人的个人数据?

被推送.被记录.被打标签.被索引.被简报.被盘问.被编号--所有这一切都是互联网公司的日常行为. 数据收集产业,这个靠着从社交媒体和移动设备上搜集信息片段获利的行业,影响每个人的生活,却不受任何有意义的监管审查.     上周,位于奥地利维也纳的文化倡导组织 "破解实验室( Cracked Labs)",发布了一份长篇报告,称"数字环境下,个人频繁被调查评估,被分类编组,排名排位,编号量化,包含/排除,并由此被区别对待." 该报告题为<日常生活中的大规模监视:

360携手Testin云测为开发者节省数十亿(图)

据统计,2014年国内新手机销量达将达4.4亿部.大量新手机的出现,为移动开发者的APP与手机适配添加了很多烦恼.最新手机型号无法第一时间买到进行测试,购买大量手机测试的人力.财力成本又非常高.为此,360移动开放平台联合全球首家移动APP真机云测试平台Testin云测,为全球开发者们献上 "360&Testin云测试"饕餮服务大礼包. 据悉,此次合作让开发者在线上即可实现所有手机和APP测试服务,且绝大多数主流机型免费开放,操作简单方便,这从根本上解决开发者繁重的测试工作,让

谷歌的数十亿代码就放在这个地方......

谷歌作为世界上最大的科技巨头之一,拥有数十亿行的代码存储,这些代码存放在不断增大的共享共享源码库之中,这一数据库拥有一个控制系统进行管理. 该代码库包含了86TB数据,约10亿个文件(包括重复文件)和3500万行注解,其中有900万个唯一的源文件,这其中包含约20亿行代码.谷歌每个工作日都要向这个数据库递交4万次命令,其中1.6万次为程序员完成,2.4万次由自动系统完成.这个代码库在高峰时的查询速度达到了80万次/秒,在平时的工作日也达到了50万次每秒的查询量. 系统支持方面,建立伊始,这个数据