MySQL 的分区
为什么分区
为什么会有分区,以及什么时候我们需要进行分区呢?我们都知道当 MySQL 单表的数量级达到一定的程度的时候,查询就会很慢。那么针对这种情况我们需要怎么处理呢?除了本身查询语句的优化之外,我们能想到的就是分库分表以及分区了。
分库分表是需要在应用层面上支持的,而分区是 MySQL 层面上支持的,在物理上将数据分成多个文件进行存储,从而提高查询速度。
如上图表 partition_sys_log_op
是采用 InnoDB 引擎并且创建了八个分区的表结构。语句如下
CREATE TABLE `partition_sys_log_op` ( `id` INT ( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', `create_time` datetime DEFAULT NULL COMMENT '操作时间', `elapsed_time` INT ( 11 ) DEFAULT NULL COMMENT '耗用时间', `exec_sql` MEDIUMTEXT CHARACTER SET utf8 COMMENT '执行的语句', `user_id` INT ( 11 ) DEFAULT NULL COMMENT '执行人id', `user_name` VARCHAR ( 45 ) CHARACTER SET utf8 DEFAULT NULL COMMENT '执行人名称', `exec_type` VARCHAR ( 45 ) CHARACTER SET utf8 DEFAULT NULL COMMENT '动作,delete update insert', `exec_table` VARCHAR ( 45 ) CHARACTER SET utf8 DEFAULT NULL COMMENT '操作表', PRIMARY KEY ( `id` ), KEY `idx_index` ( `create_time`, `user_id`, `user_name`, `exec_table` ) ) ENGINE = INNODB AUTO_INCREMENT = 1 COMMENT = '系统操作日志' PARTITION BY KEY ( ) PARTITIONS 8;
分区的类型
- Range:指定范围内分区:PARTITION p1 VALUES LESS THAN (100);
- List:离散值分区,数据在枚举范围内:partition p1 values in (2,4,6,8,0) ;
- Hash:计算单个列的 Hash值,然后指定分区数量,进行分区:PARTITION BY HASH(id) PARTITIONS 4;
- Key:计算单个或者多个列的 hash 值,然后指定分区数量,进行分区:PARTITION BY KEY(s1) PARTITIONS 10; 不传列名默认用主键。
Explain
前面提到我们经常需要对 sql 进行优化,那么如何对一条 sql 进行优化呢?我们只要在普通的 sql 前面,加上关键字 explain
即可看执行计划。根据执行计划,我们可以看到该 sql 的执行情况,以及是否采用索引以及采用的是哪个索引。例如
EXPLAIN SELECT COUNT(*) FROM partition_sys_log_op WHERE create_time >= '2020-12-03 00:00:00';
详细的 explain 的介绍可以看公号之前的文章。MySQL 之 Explain 输出分析,这里就不展开了,感兴趣的朋友可以去看看。
阿粉友情提示:更详细的脑图大家可以关注公众号,在后台回复【MySQL脑图】获得。
写在最后
最后(知识星球现在续费只要 6 折)
现在阿粉诚邀你加入我们的知识星球,这里有 1700+ 优秀的人与你一起进步,如果你是小白那你是稳赚了,很多业内经验和干货分享给你;如果你是大佬,那可以进来我们一起交流分享你的经验,说不定日后我们还可以有合作,给你的人生多一个可能。