目录阐明:分区表,顾名思义,就是一张表根据规则,分别多个区,通过分区,实现一种“逻辑隔离”,这在Saas体系中是非经常见的。本文先容如何在MySQL中分区。 创建分区在MySQL中,多种分区模式,如下:
这里先容前面两种常见的分区,Range、List。 起首,创建两张表,用户表、团体表,如下: [code]CREATE TABLE `tb_user` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NULL, `password` varchar(20) DEFAULT NULL, `create_date` datetime NOT NULL, PRIMARY KEY (`id`, `create_date`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT ='用户表,range分区'; [/code] [code]CREATE TABLE `tb_group` ( `id` int NOT NULL AUTO_INCREMENT, `group_name` varchar(20) DEFAULT NULL, `group_code` varchar(20) NOT NULL COMMENT '团体编码', PRIMARY KEY (`id`,`group_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='团体表,list分区'; [/code]必要留意
给用户表创建分区,根据创建时间(create_date)字段,如下: [code]-- 创建分区 alter table `tb_user` partition by range columns(create_date) ( partition tb_user_1735660800000 values less than ('2025-01-01 00:00:00'), partition tb_user_1767196800000 values less than ('2026-01-01 00:00:00')); [/code]这表现,创建时间在2025年内的记录为一个分区,大于2025年,小于2026年的在第二个分区。使用Range分区必要留意以下几点:
创建乐成,插入两条数据到用户表里; [code]insert into tb_user(username, password, create_date) values ('张三', '123456', now()), ('李四', 'abcdef', '2025-09-22 14:05:45') [/code]敲下面的SQL,看下分区环境: [code]select partition_ordinal_position, partition_method, partition_expression, partition_description, table_name, table_rows from information_schema.partitions where table_name = 'tb_user'; [/code]可以看到tb_user有两个分区,分区的字段,数值,以及背面两个分区各有一条记录,阐明上面插入的两条记录分到了两个分区里。 (注:下面展示的是所有数据库的tb_user表的分区环境,其他数据库有重名的表,没有重名的话,应该只有两条记录) 再试下,List分区,这次给tb_group创建一个分区,如下: [code]-- 创建一个分区 alter table `tb_group` partition by list columns(group_code) ( partition tb_group_001 values in ('001')); [/code]表现,当记录的团体编码是001时,为一个分区,下面再添加一个002分区; [code]-- 添加一个分区 alter table tb_group add partition (partition tb_group_002 values in ('002')); [/code]必要留意
插入数据之前,先看一下分区环境,两个分区,都没有记录; 插入数据 [code]insert into tb_group(group_name, group_code) values ('总公司', '001'), ('分公司', '002'); [/code]再看下分区环境,可以看到两条数据被分到了差别分区; 假如我们插入一条数据,团体编码是003,即不在任何一个分区里面,会怎么样,如下: 会报错,以是必要留意
删除分区删除某张表的分区,用下面的SQL [code]alter table tb_group drop partition tb_group_001; [/code]表现,删除tb_group表的[code]tb_group_001[/code]分区,必要留意,
综合前面的留意点,假如根据某个字段创建分区,后续发现计划不合理,想再修改字段范例大概首个分区的范围,只好删表重修了,以是分区前要考虑清楚。 分区性能这里创建一张有100万条记录的表,表结构如下 [code]CREATE TABLE `test_user_1`( id INT auto_increment primary key , username VARCHAR(32), `password` VARCHAR(32), sex VARCHAR(6) ); [/code]用下面这个存储过程,创建一百万条记录 [code]-- 创建存储过程 DELIMITER $$ CREATE PROCEDURE auto_insert() BEGIN DECLARE i INT DEFAULT 1; START TRANSACTION; WHILE(i<1000000)DO INSERT INTO `test_user_1`(username, password, sex) VALUES(CONCAT('zhangsan',i) ,MD5(i), 'male'); SET i=i+1; END WHILE; COMMIT; END$$ DELIMITER ; -- 调用 CALL auto_insert(); [/code]分别为10个分区,每个分区存10万条 如今,来查询一条记录 [code]select id, username, password, sex from test_user_1 where username='zhangsan500025'; [/code]1秒没到 如今,删除表重修,这次不建分区,再查一次,如下: (没有分区) (1秒多点) 诚实说,我也不知道建立分区对查询有没有优化,好像是有点……大家可以创建一千万条记录试下 总结本文先容了MySQL分区,及创建分区时的一些留意点,汇总如下:
到此这篇关于MySQL分区表的使用的文章就先容到这了,更多相干MySQL分区表内容请搜索脚本之家从前的文章或继续浏览下面的相干文章盼望大家以后多多支持脚本之家! 来源:https://www.jb51.net/database/328718skg.htm 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-7-2 00:07 , Processed in 0.033856 second(s), 18 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.