两种mysql典型的分表:
1、数据库上:如merge引擎;2、程序上:事先建立多表,程序存取数据先判断,然后再对哪张表进行操作。
分表一般是数据量非常大,而且访问上没有绝对的热点,基本上所有的数据都有可能会访问到,为了查询的性能和平时DDL的快速会采用分表的方法。
对于查询语句简单、有热点数据,考虑表分区。
分区(range):
mysql优化器支持以下两种内置的日期函数进行分区:
TO_DAYS()
YEAR()
注意问题:
主键或者唯一索引必须包含分区字段:如PRIMARY KEY(id, created),不过对INNODB来说,大主键不爽。
采用分区的表不支持外键:相关的约束逻辑必须通过程序来实现。
注意增加MAXVALUE分区
不同的主从服务器分区策略,例如master按Hash分区,slave按range分区:在主服务器上使用range类型的分区通常并没有太大意义,此时使用hash类型的分区相对更好一些,假设使用PARTITION BY HASH(id) PARTITIONS 10,那么当插入新数据时,会根据id把数据平均分散到各个分区上,由于文件小,所以效率高,更新操作会变得更快。
是否分区正确,务必用explain验证下是否在相应的分区查询。
在已经建好没有分区功能的表上是不能添加分区的,只能新建,然后数据导过去。
--1--
CREATE TABLE `loginoff` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, -----必须去掉
`monetid` varchar(20) DEFAULT NULL,
`action` varchar(20) DEFAULT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `id` (`id`),
KEY `idx_monetid` (`monetid`),
KEY `idx_date_monetid` (`date`,`monetid`,`action`)
)partition by range(to_days(date))(
partition p2012 values less than (2012-01_01),
partition p2013 values less than (2013-01_01),
partition p2014 values less than (2014-01_01),
partition p2015 values less than (2015-01_01),
partition p2016 values less than MAXVALUE);
新增分区
mysql> ALTER TABLE sale_data
-> ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
删除分区
mysql> ALTER TABLE sale_data DROP PARTITION p201010;
分区的合并
mysql> ALTER TABLE sale_data
-> REORGANIZE PARTITION p201001,p201002,p201003,
-> p201004,p201005,p201006,
-> p201007,p201008,p201009 INTO
-> (
-> PARTITION p2010Q1 VALUES LESS THAN (201004),
-> PARTITION p2010Q2 VALUES LESS THAN (201007),
-> PARTITION p2010Q3 VALUES LESS THAN (201010)
-> );
分区的拆分
mysql> ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO (
-> PARTITION s2009 VALUES LESS THAN (201001),
-> PARTITION s2010 VALUES LESS THAN (201004)
-> );
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22005290/viewspace-747067/ ,如需转载,请注明出处,否则将追究法律责任。