注意:
很明确提示用phalcon自带的模型层是不能用partition这个关键字的
解决方法:
自己写个PDO类
然后用pdo中的query方法执行语句成功;
mysql分区目的
是减少数据库的负担,提高数据库的效率,(提高表的增删改查效率)。
什么是分表?
将一个大表按照一定的规则分解成多张具有独立存储空间的实体表
每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件
什么是分区?
分区是将一个大表数据分段划分在多个位置存放
分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。
CREATE TABLE `orders3` (
`order_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`out_trade_no` VARCHAR(50) NOT NULL COMMENT '第三方订单号',
`mch_id` INT(11) UNSIGNED NOT NULL COMMENT '系统商户号',
`writetime` INT(10) UNSIGNED NOT NULL COMMENT '下单时间',
PRIMARY KEY (`order_id`, `writetime`)
)
ENGINE=InnoDB
COMMENT='订单表'
COLLATE='utf8_general_ci'
AUTO_INCREMENT=1
PARTITION BY RANGE (writetime)
(
/**表的所有分区标识符: d20161111必须是唯一的名字。(注意不区分大小写)**/
PARTITION d20161111 VALUES LESS THAN (unix_timestamp('20161111')),
PARTITION d20161112 VALUES LESS THAN (unix_timestamp('20161112')),
PARTITION dall VALUES LESS THAN MAXVALUE //这个加了后不能使用alter table `orders` add partition这个语句了
)
INSERT INTO orders VALUES (null, '第三方订单号', 1000001, 1472550901);
INSERT INTO orders VALUES (null, '第1方订单号', 1000002, 1472513901);
//对未分区的表进行分区
alter table orders_channels partition by RANGE(writetime) (
PARTITION d20161117 VALUES LESS THAN (unix_timestamp('20161118')),
PARTITION d20161118 VALUES LESS THAN (unix_timestamp('20161119')),
PARTITION d20161119 VALUES LESS THAN (unix_timestamp('20161120')),
);
//新增一个分区
alter table `orders` add partition (partition p20161112 values less than (unix_timestamp('20161112')));
//删除分区语句
alter table `orders` drop partition p20161116;
//查询分区语句
SELECT
partition_name part,
partition_expression expr,
partition_description descr,
FROM_DAYS(partition_description) lessthan_sendtime,
table_rows
FROM
INFORMATION_SCHEMA.partitions
WHERE
TABLE_SCHEMA = SCHEMA()
AND TABLE_NAME='orders_channels' ; //orders_channels只需要改表明其他不动