Welcome 微信登录

首页 / 数据库 / MySQL / 利用MRG_MyISAM存储引擎实现分表

简介:
引用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 testG
*************************** 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: 0mysql> 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用MySQL实现类似Oracle SPOOL的功能MongoDB初学笔记相关资讯      MRG_MyISAM  MERGE 
  • Oracle中merge命令的简单使用  (03/22/2015 13:56:20)
本文评论 查看全部评论 (0)
表情: 姓名: 字数

版权所有©石家庄振强科技有限公司2024 冀ICP备08103738号-5 网站地图