【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)

原文地址:http://blog.csdn.net/zwan0518/article/details/11972853

目录(?)[-]

  1. 一查询优化
    1. 1创建索引
    2. 2缓存的配置
    3. 3slow_query_log分析
    4. 4分库分表
    5. 5子查询优化
  2. 二数据转移
    1. 21插入数据

如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。

虽然关系型数据库在海量数据中逊色于NoSQL数据库,但是如果你操作正确,它的性能还是会满足你的需求的。针对数据的不同操作,其优化方向也是不尽相同。对于数据移植,查询和插入等操作,可以从不同的方向去考虑。而在优化的时候还需要考虑其他相关操作是否会产生影响。就比如你可以通过创建索引提高查询性能,但是这会导致插入数据的时候因为要建立更新索引导致插入性能降低,你是否可以接受这一降低那。所以,对数据库的优化是要考虑多个方向,寻找一个折衷的最佳方案。

一:查询优化

1:创建索引。

最简单也是最常用的优化就是查询。因为对于CRUD操作,read操作是占据了绝大部分的比例,所以read的性能基本上决定了应用的性能。对于查询性能最常用的就是创建索引。经过测试,2000万条记录,每条记录200字节两列varchar类型的。当不使用索引的时候查询一条记录需要一分钟,而当创建了索引的时候查询时间可以忽略。但是,当你在已有数据上添加索引的时候,则需要耗费非常大的时间。我插入2000万条记录之后,再创建索引大约话费了几十分钟的样子。

创建索引的弊端和场合。虽然创建索引可以很大程度上优化查询的速度,但是弊端也是很明显的。一个是在插入数据的时候,创建索引也需要消耗部分的时间,这就使得插入性能在一定程度上降低;另一个很明显的是数据文件变的更大。在列上创建索引的时候,每条索引的长度是和你创建列的时候制定的长度相同的。比如你创建varchar(100),当你在该列上创建索引,那么索引的长度则是102字节,因为长度超过64字节则会额外增加2字节记录索引的长度。

从上图可以看到我在YCSB_KEY这一列(长度100)上创建了一个名字为index_ycsb_key的索引,每条索引长度都为102,想象一下当数据变的巨大无比的时候,索引的大小也是不可以小觑的。而且从这也可以看出,索引的长度和列类型的长度还不同,比如varchar它是变长的字符类型(请看MySQL数据类型分析),实际存储长度是是实际字符的大小,但是索引却是你声明的长度的大小。你创建列的时候声明100字节,那么索引长度就是这个字节再加上2,它不管你实际存储是多大。

除了创建索引需要消耗时间,索引文件体积会变的越来越大之外,创建索引也需要看的你存储数据的特征。当你存储数据很大一部分都是重复记录,那这个时候创建索引是百害而无一利。请先查看MySQL索引介绍。所以,当很多数据重复的时候,索引带来的查询提升的效果是可以直接忽略的,但是这个时候你还要承受插入数据的时候创建索引带来的性能消耗。

2:缓存的配置。

在MySQL中有多种多样的缓存,有的缓存负责缓存查询语句,也有的负责缓存查询数据。这些缓存内容客户端无法操作,是由server端来维护的。它会随着你查询与修改等相应不同操作进行不断更新。通过其配置文件我们可以看到在MySQL中的缓存:

在这里主要分析query cache,它是主要用来缓存查询数据。当你想使用该cache,必须把query_cache_size大小设置为非0。当设置大小为非0的时候,server会就会缓存每次查询返回的结果,到下次相同查询server就直接从缓存获取数据,而不是再执行查询。能缓存的数据量就和你的size大小设置有关,所以当你设置的足够大,数据可以完全缓存到内存,速度就会非常之快。

但是,query cache也有它的弊端。当你对数据表做任何的更新操作(update/insert/delete)等操作,server为了保证缓存与数据库的一致性,会强制刷新缓存数据,导致缓存数据全部失效。所以,当一个表格的更新数据表操作非常多的话,query cache是不会起到查询提升的性能,还会影响其他操作的性能。

3:slow_query_log分析。

其实对于查询性能提升,最重要也是最根本的手段也是slow_query的设置。

当你设置slow_query_log为on的时候,server端会对每次的查询进行记录,当超过你设置的慢查询时间(long_query_time)的时候就把该条查询记录到日志。而你对性能进行优化的时候,就可以分析慢查询日志,对慢查询的查询语句进行有目的的优化。可以通过创建各种索引,可以通过分表等操作。那为什么要分库分表那,当不分库分表的时候那个地方是限制性能的地方啊。下面我们就简单介绍。

4:分库分表

分库分表应该算是查询优化的杀手锏了。上述各种措施在数据量达到一定等级之后,能起到优化的作用已经不明显了。这个时候就必须对数据量进行分流。分流一般有分库与分表两种措施。而分表又有垂直切分与水平切分两种方式。下面我们就针对每一种方式简单介绍。

对于mysql,其数据文件是以文件形式存储在磁盘上的。当一个数据文件过大的时候,操作系统对大文件的操作就会比较麻烦与耗时,而且有的操作系统就不支持大文件,所以这个时候就必须分表了。另外对于mysql常用的存储引擎是Innodb,它的底层数据结构是B+树。当其数据文件过大的时候,B+树就会从层次和节点上比较多,当查询一个节点的时候可能会查询很多层次,而这必定会导致多次IO操作进行装载进内存,肯定会耗时的。除此之外还有Innodb对于B+树的锁机制。对每个节点进行加锁,那么当更改表结构的时候,这时候就会树进行加锁,当表文件大的时候,这可以认为是不可实现的。

所以综上我们就必须进行分表与分库的操作。

5:子查询优化

在查询中经常会用到子查询,在子查询的时候一般使用in或者exist关键词。针对in和exist在查询的时候当数据量大到一定程度以后,查询执行时间就差别比较大。但是,为了避免此类情况出现,最好的方式是使用join查询。因为在绝大多数情况下,服务器对join的查询优化要远远高于子查询优化。在比较高的版本5.6,mysql查询会自动把in查询优化成joint查询,就不会出现子查询比较慢的问题。有时候也可以采用distinct关键词来限制子查询的数量,但是需要注意的是distinct很多时候会转化为group by,这个时候就会出现一个临时表,就会出现copy数据到临时表的时延。

更多的子查询优化请点击

二:数据转移

当数据量达到一定等级之后,那么移库将是一个非常慎重又危险的工作。在移库中保证前后数据的一致性,各种突发情况的处理,移库过程中数据的变迁,每一个都是一个非常困难的问题。

2.1:插入数据

当进行数据迁移的时候,肯定会存在大数据的重新导入,你可以选择直接load文件,有的时候可能就需要代码插入了。这个时候就需要对插入语句进行一定的优化了。这个时候可以使用INSERT DELAYED语句,该语句是当你发出插入请求的时候,不是马上就插入到数据库而是放在缓存里面,等待时机成熟之后再进行插入。

待补充。。。

时间: 2024-10-04 05:11:03

【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)的相关文章

MySQL数据库如何解决大数据量存储问题

利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,Value,DataTime).基本上每张表每天可以增加几千万条数据,我想问如何存储数据才能不影响检索速度呢?需不需要换oracle数据库呢?因为我是数据库方面的新手,希望可以说的详细一点,万分感谢!!?-0-#暂时可以先考虑用infobri

利用MySQL数据库如何解决大数据量存储问题?

提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节: 2.数据项:是否有大字段,那些字段的值是否经常被更新: 3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE.GROUP BY.ORDER BY子句中等: 4.数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中: 5.SQL量的统计比,

.Net中EF针对大数据量查询超时的一种优化

旧代码: --receiptIds   id集合,每次查1000左右 var mappingList = new List<FinanceSettlementMapping>(); mappingList.AddRange(SettlementMappingRepository.Entities.Include(o => o.ReceiptsTo).Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains

asp.net中绘制大数据量的可交互的图表

在一个asp.net项目中要用到能绘制大数据量信息的图表,并且是可交互的(放大.缩小.导出.打印.实时数据),能够绘制多种图形. 为此进行了多方调查预研工作,预研过微软的MsChart图表组件.基于jquery的FlortChart图表.Silverlight的Visifire图表组件.基于js和flash的FusionCharts图表.Ext4.0框架中的图表.纯js的Highstock和纯js的Highcharts. 下面给出各个图表的预研结果,以供参考. MsChart MsChart是一

impala大数据量查询/tmp/impala-scratch创建异常

使用impala做大数据量查询distinct的时候报如下错误 WARNINGS: Create file /tmp/impala-scratch/24414dab2c19caca:e54b206c5ab149d_24414dab2c19caca:e54b206c5ab149f_91001337-9d70-4c93-84ce-e7916c1ae804 failed with errno=2 description=Error(2): No such file or directory Backe

WCF大数据量传输解决方案

文章内容列表:1. 场景:2. 解决方案3. WCF契约与服务实现设计静态图4. WCF契约与服务实现设计详细说明6. 服务端启动服务代码:7. 客户端代码8.   WCF大数据量传输解决方案源码下载 1. 场景: WCF在网络传输中,大数据量传输造成网络阻塞,宽带无法承受: 2. 解决方案 解决WCF在网络传输中的大数据量问题: A.需要把相关数据序列化成字节流,再对字节流进行压缩,再进行传输,到了客户端再做反向操作便可获得原始数据. B.如果压缩后的数据仍然较大时,可以再压缩流后,再对流进行

MySQL 分库分表方案,总结的非常好!

前言 公司最近在搞服务分离,数据切分方面的东西,因为单张包裹表的数据量实在是太大,并且还在以每天60W的量增长. 之前了解过数据库的分库分表,读过几篇博文,但就只知道个模糊概念, 而且现在回想起来什么都是模模糊糊的. 今天看了一下午的数据库分库分表,看了很多文章,现在做个总结,"摘抄"下来.(但更期待后期的实操) 会从以下几个方面说起: 第一部分:实际网站发展过程中面临的问题. 第二部分:有哪几种切分方式,垂直和水平的区别和适用面. 第三部分:目前市面有的一些开源产品,技术,它们的优缺

大数据平台架构技术选型与场景运用

一.大数据平台 大数据在工作中的应用有三种: 与业务相关,比如用户画像.风险控制等: 与决策相关,数据科学的领域,了解统计学.算法,这是数据科学家的范畴: 与工程相关,如何实施.如何实现.解决什么业务问题,这是数据工程师的工作. 数据工程师在业务和数据科学家之间搭建起实践的桥梁.本文要分享的大数据平台架构技术选型及场景运用偏向于工程方面. 如图所示,大数据平台第一个要素就是数据源,我们要处理的数据源往往是在业务系统上,数据分析的时候可能不会直接对业务的数据源进行处理,而是先经过数据采集.数据存储

大数据量时Mysql的优化要点

如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL的出现暂时解决了这一危机.它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升.但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的.这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库. 虽然关系型数据库在海量数据中逊色于NoSQL