MySQL Partition
作者:老王 三国演义开篇一语道破:合久必分!MySQL的使用亦是如此,面对应用中越来越庞大的数据量,最时髦的解决方案是Shard,不过它的复杂性并不是每个程序员都能驾驭的,如果把架构的演变比作生命的进化,那么Shard可以看做是哺乳动物,很多架构最后之所以失败,就是因为它们步子迈得太大,想从原始生命直接进化成哺乳动物,殊不知这中间还有爬行动物等必经阶段。
在MySQL没有支持Partition之前,如果想把数据分而治之,可以使用MySQL提供的Merge的引擎,例子:
先建立两个结构一样的MyISAM表:
CREATE TABLE foo_1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
created DATETIME
) ENGINE=MyISAM;
CREATE TABLE foo_2 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
created DATETIME
) ENGINE=MyISAM;
再建立MERGE表:
CREATE TABLE foo (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
created DATETIME
) ENGINE=MERGE UNION=(foo_1, foo_2) INSERT_METHOD=LAST;
对调用者而言,MERGE表就像一个UNION语句一样,这样确实很方便,不过它有很多弱点:
首先,它不是完全透明的,需要有若干基础表(foo_1,foo_2)的存在,而且基础表必须是MyISAM表类型,另外,对于MERGE来说,不支持约束,比如上面的foo表定义中,虽然把id定义为主键,但是如果我们在foo_1和foo_2分别插入一个相同id的话,foo表也不会报错。
言归正传!MySQL从5.1.3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition:
mysql> SHOW VARIABLES LIKE '%partition%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用:
CREATE TABLE foo (
id INT NOT NULL AUTO_INCREMENT,
created DATETIME,
PRIMARY KEY(id, created)
) ENGINE=INNODB PARTITION BY RANGE (TO_DAYS(created)) (
PARTITION foo_1 VALUES LESS THAN (TO_DAYS('2009-01-01')),
PARTITION foo_2 VALUES LESS THAN (TO_DAYS('2010-01-01'))
)
即便创建完分区,也可以在后期管理,比如说添加一个新的分
相关文档:
注意:MySQL中每个命令后都要以分号;结尾。
(1)显示数据库
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.04 sec)
Mysql刚安装完有两个数据库:mysql和test。其中,mysql库非常重要,它里面有MyS ......
运行程序可能会报错:Can’t connect to local MySQL Server through socket ‘/tmp/mysql.sock’
这个错误的提示是说,不能通过’/tmp/mysql.sock’连接到服务器。Mysql.sock是创建与mysqld服务器相关的MySQL通信端点所使用的套接字。而PHP标准配置正是通过’/tmp/mysql.sock’来连接 ......
1006:MYSQL 创建数据库失败 ......
假如我有个user表,我想查询符合某些条件的第50个用户开始的10个用户,且不能使用id号between and那样查询,应该怎么写SQL语句?
在mysql数据库中有limit,offset语句可以方便的实现,那么在SQL server中呢?SQL Server是否支持limit和offset语句呢?
select top 10 * from
(select top 60 * from [user] order by userid) a ......
你可以创建一个文本文件“pet.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以CREATE TABLE语句中列出的列次序给出。对于丢失的值(例如未知的性别,或仍然活着的动物的死亡日期),你可以使用NULL值。为了在你的文本文件中表示这些内容,
使用\N(反斜线,字母N)。例如,Whistler鸟的记录应为(这里值之 ......