MYSQL 分表原理(转)

简介:
引用MySQL官方文档中的一段话:MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合."相同"意味着所有表同样的列和索引信息.你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表.而且,任何或者所有的表可以用myisampack来压缩.

例子:
mysql>
show
engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
|
Engine             | Support | Comment  
                     
                     
         | Transactions | XA   | Savepoints
|
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
|
MEMORY             | YES     | Hash
based, stored in memory, useful for temporary tables      | NO
          | NO   | NO        
|
| MRG_MYISAM         | YES     |
Collection of identical MyISAM tables            
             | NO        
  | NO   | NO         |
| MyISAM
            | YES     | MyISAM storage
engine                    
                     | NO
          | NO   | NO        
|
| BLACKHOLE          | YES  
  | /dev/null storage engine (anything you write to it disappears) | NO
          | NO   | NO        
|
| CSV                |
YES     | CSV storage engine            
                     
          | NO           | NO
  | NO         |
| PERFORMANCE_SCHEMA |
YES     | Performance Schema            
                     
          | NO           | NO
  | NO         |
| ARCHIVE  
         | YES     | Archive storage engine
                     
                  | NO  
        | NO   | NO        
|
| FEDERATED          | NO  
   | Federated MySQL storage engine          
                      |
NULL         | NULL | NULL      
|
| InnoDB             | DEFAULT |
Supports transactions, row-level locking, and foreign keys     | YES
         | YES  | YES      
 |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9
rows in set (0.00 sec)

mysql> create table test1 (id int
not null auto_increment,name varchar(10) default null ,primary key (id))
engine=myisam auto_increment=1;          
 
Query OK, 0 rows affected (0.01
sec)

mysql> create table test2 (id int not null
auto_increment,name varchar(10) default null ,primary key (id)) engine=myisam
auto_increment=1; 
Query OK, 0 rows affected (0.00
sec)

mysql> INSERT INTO `test1` (`name`)
VALUES(‘beijing1‘);   
Query OK, 1 row affected (0.00
sec)

mysql> INSERT INTO `test2` (`name`)
VALUES(‘beijing2‘); 
Query OK, 1 row affected (0.00
sec)

mysql> create table test (id int not null
auto_increment,name varchar(10) default null ,index(id)) engine=mrg_myisam
union=(test1,test2) insert_method=last auto_increment=1;
Query
OK, 0 rows affected (0.03 sec)

mysql> select id,name from
test;  
+----+----------+
| id | name
    |
+----+----------+
|  1 |
beijing1 |
|  1 | beijing2
|
+----+----------+
2 rows in set (0.00
sec)

mysql> INSERT INTO `test` (`name`)
VALUES(‘beijing3‘);   
Query OK, 1 row affected (0.00
sec)

mysql> select id,name from test;    
               
 
+----+----------+
| id | name  
  |
+----+----------+
|  1 | beijing1
|
|  1 | beijing2 |
|  2 | beijing3
|
+----+----------+
3 rows in set (0.00
sec)

mysql> select id, name from test2    
    
    ->
;
+----+----------+
| id | name    
|
+----+----------+
|  1 | beijing2
|
|  2 | beijing3
|
+----+----------+
2 rows in set (0.00
sec)

mysql> system ls -l
/mysql/data/test
total 164
-rw-rw---- 1 mysql
mysql  8586 Feb  2 16:40 test1.frm
-rw-rw---- 1 mysql
mysql    20 Feb  2 16:40 test1.MYD
-rw-rw---- 1
mysql mysql  2048 Feb  2 16:40 test1.MYI
-rw-rw---- 1
mysql mysql  8586 Feb  2 16:40 test2.frm
-rw-rw---- 1
mysql mysql    40 Feb  2 16:44
test2.MYD
-rw-rw---- 1 mysql mysql  2048 Feb  2 16:44
test2.MYI
-rw-rw---- 1 mysql mysql  8586 Feb  2 16:43
test.frm
-rw-rw---- 1 mysql mysql    32 Feb  2
16:43
test.MRG

在这里需要注意建立MRG_MYISAM需要必须指定一个UNION=(list-of-tables)子句,它说明你要把哪些表当作一个表来用.另外一个重要的参数INSERT_METHOD,此参数INSERT_METHOD
= NO 表示该表不能做任何写入操作只作为查询使用,INSERT_METHOD =
LAST表示插入到最后的一张表里面.

例子:
mysql> show create
table test\G
*************************** 1. row
***************************
       Table:
test
Create Table: CREATE TABLE `test` (
 
`id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10)
DEFAULT NULL,
  KEY `id` (`id`)
)
ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=LAST
UNION=(`test1`,`test2`)
1 row in set (0.00
sec)

mysql> CREATE TABLE `test` (`id` int(11) NOT NULL
AUTO_INCREMENT,`name` varchar(10) DEFAULT NULL,KEY `id` (`id`))ENGINE=MRG_MyISAM
DEFAULT CHARSET=utf8 INSERT_METHOD=NO UNION=(`test1`,`test2`);    
         
Query OK, 0 rows affected
(0.00 sec)

mysql> select * from
test;
+----+----------+
| id | name  
  |
+----+----------+
|  1 | beijing1
|
|  1 | beijing2 |
|  2 | beijing3
|
+----+----------+
3 rows in set (0.00
sec)

mysql> INSERT INTO `test` (`name`)
VALUES(‘beijing4‘);
ERROR 1036 (HY000): Table ‘test‘ is read
only

当你需要在现有MRG_MYISAM添加新表的时候可以这样做
mysql>
create table test3 (id int not null auto_increment,name varchar(10) default null
,primary key (id)) engine=myisam auto_increment=1; 
Query
OK, 0 rows affected (0.02 sec)

mysql> alter table test
engine=mrg_myisam union=(test1,test2,test3 ) insert_method=last;    
                     
         
Query OK, 0 rows affected
(0.01 sec)
Records: 0  Duplicates: 0  Warnings:
0

mysql> select * from
test;
+----+----------+
| id | name  
  |
+----+----------+
|  1 | beijing1
|
|  1 | beijing2 |
|  2 | beijing3
|
+----+----------+
3 rows in set (0.00
sec)

mysql> INSERT INTO `test` (`name`)
VALUES(‘beijing4‘);                
                     
                     
                     
 
Query OK, 1 row affected (0.00
sec)

mysql> select * from test;      
                   
 
+----+----------+
| id | name  
  |
+----+----------+
|  1 | beijing1
|
|  1 | beijing2 |
|  2 | beijing3
|
|  3 | beijing4
|
+----+----------+
4 rows in set (0.00
sec)

mysql> select * from test3;      
                 
  
+----+----------+
| id | name
    |
+----+----------+
|  3 |
beijing4 |
+----+----------+
1 row in set (0.00
sec)

OK,完成了.

对于日常来说MRG_MYISAM分表优点主要有以下几点:
(1)对于日志类应用的表.比如,你可以把每月的数据放进分离的表中,用myisampack压缩这些表,创建一个MERGE表来把它们当作一个表来使用非常方便快捷.
(2)在查询速度上应该更优,对于一些表可以分割大的只读表,放进不同磁盘上的单个表中.基于这个建立一个MERGE表会比单纯一个大表速度应该会快不少.
(3)超过操作系统的文件尺寸限制,每个MyISAM表都受制于这个限制,但是MRG_MYSIAM则不会.
缺点:
MRG_MYISAM不支持全文索引还有其它一些MyISAM功能,当然可以在底表创建,但是仍然不能利用全文索引在MRG表上搜索.建立全文会报如下错误
ERROR
1214 (HY000): The used table type doesn‘t support FULLTEXT indexes

转自: http://zzjlzx.blog.chinaunix.net/uid-10661836-id-4095860.html

MYSQL 分表原理(转),布布扣,bubuko.com

时间: 2024-10-31 07:25:14

MYSQL 分表原理(转)的相关文章

mysql分表方法-----MRG_MyISAM引擎分表法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解. 首先,我们需要想好到底分多少个表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,

mysql 分表与分区

一.操作环境 数据达到百w甚于更多的时候,我们的mysql查询将会变得比较慢, 如果再加上连表查询,程序可能会卡死.即使你设置了索引并在查询中使用到了索引,查询还是会慢.这时候你就要考虑怎么样来提高查询速度了. 抛弃其他的不讲,只从mysql本身的优化来讲,我所知道的方法有三种:mysql集群,mysql分表,mysql分区 二.mysql集群 mysql集群成本比较高,不过这不是这里讲的重点,后期开一篇文章,专门来讲这方面的知识. 三.mysql分表 1. 当数据达到百w,千w的时候,我们就想

mysql分表和表分区详解

为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率. 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件.这些子表可以分布在

mysql分表的三种方法

mysql分表的3种方法 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. 根据个人经验,mysql执行一个sql的过程如下:1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果.在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间.其实这二个是一回事,等待的同时,肯定有sql在执行.所以我们要缩短sql的执行

mysql分表研究

分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得 单表记录条数达到百万到千万级别时就要使用分表了. 1,分表的分类 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表.(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的.) 分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的) 案例: 对于一个博客系统,文章标题,作者,分类

使用Merge存储引擎实现MySQL分表

一.使用场景 Merge表有点类似于视图.使用Merge存储引擎实现MySQL分表,这种方法比较适合那些没有事先考虑分表,随着数据的增多,已经出现了数据查询慢的情况. 这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码.所以使用Merge存储引擎实现MySQL分表可以避免改代码. Merge引擎下每一张表只有一个MRG文件.MRG里面存放着分表的关系,以及插入数据的方式.它就像是一个外壳,或者是连接池,数据存放在分表里面. 对于增删改查,直接操作总表即可. 二.建表 1.用户1表

mysql分表场景分析与简单分表操作

为什么要分表 首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间. 表分割有两种方式: 1水平分割:根据一列或多列数据的值把数据行放到两个独立的表中. 水平分割通常在下面的情况下使用: 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度. 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用. 需要把数据存

一、mysql分表简单介绍

一.Mysql分表的原因 1.当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 2.mysql中有一种机制是表锁定和行锁定,为什么要出现这种机制,是为了保证数据的完整性, 我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢? 很显然mysql对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innod

mysql分表规则(转)

author:skatetime:2013/05/14 Mysql分表准则 在大量使用mysql时,数据量大.高访问时,为了提高性能需要分表处理,简介下mysql分表的标准,后续会继续补充 环境:业务类型:OLTP硬件:cpu:8cpu 2.4GHZmem:48G磁盘:raid5 6×sas 什么样的表需要拆分:根据表的体积.表的行数.访问特点来衡量表是否需要拆分 一.拆分标准是:  1.表的体积大于2G或行数大于1000w,以单表主键等简单形式访问数据,这个时候需要分表  2.表的体积大于2G