mysql 大量数据处理问题

一、大量数据存储问题解决方法

分区、分表

原则:多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈 

区别:

1,实现方式上 

mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表;

分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了

2,数据处理上 

分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面;

分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。

3,提高性能上 

a),分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,

如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,

本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。 


b),mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。 

在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,

从而达到提高mysql性能的目的。 


4),实现的难易度上 

a),分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。

如果是用其他分表方式就比分区麻烦了。 


b),分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。 


分区:分区应该注意的事项:
1、 做分区时,要么不定义主键,要么把分区字段加入到主键中。
2、 分区字段不能为NULL,要不然怎么确定分区范围呢,所以尽量NOT NULL
二、分区的类型
RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包>含MySQL中有效的、产生非负整数值的任何表达式。
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含>整数值。

range分区
 create table t_range( 
  id int(11), 
  money int(11) unsigned not null, 
  date datetime 
  )partition by range(year(date))( 
  partition p2007 values less than (2008), 
  partition p2008 values less than (2009), 
  partition p2009 values less than (2010) 
  partition p2010 values less than maxvalue 
  );

分表:

先建表:
mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
    ->    a INT NOT NULL AUTO_INCREMENT,
    ->    message CHAR(20), INDEX(a))
    ->    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
其中t1,t2是分表
total是t1,t2两个表所有的数据
查询的时候
select * from toal
表面上看和普通表一样,其实上这个查询进行Mysql分表查询,只是对于操作者透明而已
插入的话也是
insert into total(message)values('message');
会默认插入LAST表,也就是t2表

你可能感兴趣的:(mysql 大量数据处理问题)