厦门网站建设a,上海网站建设推荐,网站设计与网页制作培训,wordpress首页生成html某些行业数据量的增长速度极快#xff0c;随着数据库中数据量的急速膨胀#xff0c;数据库的插入和查询效率越来越低。此时#xff0c;除了程序代码和查询语句外#xff0c;还得在数据库的结构上做点更改#xff1b;在一个主读辅写的数据库中#xff0c;当数据表数据超过…某些行业数据量的增长速度极快随着数据库中数据量的急速膨胀数据库的插入和查询效率越来越低。此时除了程序代码和查询语句外还得在数据库的结构上做点更改在一个主读辅写的数据库中当数据表数据超过1000w行后那查询效率真的很让人抓狂。就算早前建了索引也很难满足用户对于系统查询效率的体验。优化方案是分表或分区。至于分区的原理以及分区和分表的区别搜索一下都介绍的很详细这里就不作冗余介绍。简单来讲分表旨在提高数据库的并发能力分区旨在优化磁盘的IO和数据的读写所以采用什么方案还得根据业务再作斟酌。由于我们的系统对并发要求不高所以便采用了分区。分区是MySQL5.1以后实现的。其中分区类型有RANGE分区、LIST分区、HASH分区、KEY分区。我们这里是使用RANGE分区来讲解。分区需要注意的一点是要么不定义主键要么把分区字段添加到主键中。并且分区字段不能为NULL要不然就难以确定分区范围。所以要设为NOT NULL。首先执行一下show plugins; 查看partition这一栏是否为ACTIVE是则表示数据库支持分区。1、创建一个数据表并分区CREATE TABLE table_name (id INT(11) NOT NULL AUTO_INCREMENT,uid VARCHAR(50) DEFAULT NULL,action VARCHAR(10) DEFAULT NULL, channel VARCHAR(20) DEFAULT NULL,count_left INT(11) DEFAULT NULL,end_time INT(11) DEFAULT 0,PRIMARY KEY (id,end_time),KEY time (end_time)) ENGINEMYISAM DEFAULT CHARSETutf8PARTITION BY RANGE(end_time) (PARTITION p161130 VALUES LESS THAN (1480550399),PARTITION p161231 VALUES LESS THAN (1483228799),PARTITION p170131 VALUES LESS THAN (1485907199),PARTITION p170228 VALUES LESS THAN (1488326399),PARTITION p170331 VALUES LESS THAN (1491004799),PARTITION p170430 VALUES LESS THAN (1493596799),PARTITION p170531 VALUES LESS THAN (1496275199),PARTITION p170631 VALUES LESS THAN (1498867199),PARTITION pnow VALUES LESS THAN MAXVALUE);2、修改一个数据表分区ALTER TABLE table_namePARTITION BY RANGE(end_time) (PARTITION p161130 VALUES LESS THAN (1480550399),PARTITION p161231 VALUES LESS THAN (1483228799),PARTITION p170131 VALUES LESS THAN (1485907199),PARTITION p170228 VALUES LESS THAN (1488326399),PARTITION p170331 VALUES LESS THAN (1491004799),PARTITION p170430 VALUES LESS THAN (1493596799),PARTITION p170531 VALUES LESS THAN (1496275199),PARTITION p170631 VALUES LESS THAN (1498867199),PARTITION pnow VALUES LESS THAN MAXVALUE);说明1、2中使用end_time (时间是以时间戳的形式记录的) 作为分区字段对表进行分区。分区的区分值为分区名中的时间的时间戳形式比如2016/11/30 23:59:59 转为秒数为1480550399。以上的代码中我将数据表分为9个区从16年11月30日到17年06月31日 共8个区加上pnow这个区存放17年6月31日以后的数据如上所示16年11月30日以前的数据将会存放在p161130这个分区中16年12月01日至16年12月31日的数据将会存放在p161231分区中以此类推…分区后可以执行以下语句查看效果(后面也可以用该语句查看每个分区中有多少数据)SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME table_name;3、删除一个分区执行语句ALTER TABLE table_name DROP PARTITION p_name;注意删除一个分区时该分区内的所有数据也都会被删除如果用这样来删除数据要比用delete from table_name where …要有效得多4、新增一个分区执行语句ALTER TABLE table_name ADD PARTITION (PARTITION p_name VALUES LESS THAN (xxxxxxxxx));注意如果原先最后一个分区是PARTITION pnow VALUES LESS THAN MAXVALUE; 那么应该先删除该分区然后在执行新增分区语句然后再新增回该分区