mysql数据库按日期简单分区

本文讲述了作者在处理千万级MySQL数据库性能下降问题时,通过创建索引和分区表来提高效率的经验分享,包括如何按datetime字段分区以及如何添加、查看和验证分区效果。
摘要由CSDN通过智能技术生成

前段时间学着创建了一个mysql数据库,数据近千万之后性能明显下降,找到了一些简单有效的提速方法,首先是创建索引,其次就是分区表,这里记录一下分区。

一、表格格式

我用的字段名是“日期时间”,类型为datetime。

二、创建分区

看了很多教程都建议以"p+yyyymmyy"命名分区,且因为使用less than,所以创建的分区名日期要比括号里的日期小一天。这样才能保证分区名的日期与分区内的数据日期对应,创建时应该要查看当前数据库内数据的所有日期,每天创建一个分区,不常用的老数据也可以都放到最前面的一个分区里,但是注意命名:

-- 字段名应该是datetime类型,或者date
ALTER TABLE 表名 PARTITION BY RANGE COLUMNS(字段名) (
    PARTITION p20240220 VALUES LESS THAN ('2024-02-21'),
    PARTITION p20240221 VALUES LESS THAN ('2024-02-22'),
    PARTITION p20240222 VALUES LESS THAN ('2024-02-23'),
    PARTITION p20240223 VALUES LESS THAN ('2024-02-24'),
    PARTITION p20240224 VALUES LESS THAN ('2024-02-25'),
    PARTITION p20240225 VALUES LESS THAN ('2024-02-26'),
    PARTITION p20240226 VALUES LESS THAN ('2024-02-27'),
    PARTITION p20240227 VALUES LESS THAN ('2024-02-28'),
    PARTITION p20240228 VALUES LESS THAN ('2024-02-29'),
    PARTITION p20240229 VALUES LESS THAN ('2024-03-01')
);

三、新增分区

后期要添加分区可以使用ADD PARTITION :

ALTER TABLE 表名 ADD PARTITION (
	PARTITION p20240301 VALUES LESS THAN ('2024-03-02'),
	PARTITION p20240302 VALUES LESS THAN ('2024-03-03'),
	PARTITION p20240303 VALUES LESS THAN ('2024-03-04'),
	PARTITION p20240304 VALUES LESS THAN ('2024-03-05'),
	PARTITION p20240305 VALUES LESS THAN ('2024-03-06')
);

四、查看所有分区

SELECT table_name, partition_name, table_rows 
FROM information_schema.partitions 
WHERE table_schema = '数据库名' AND table_name = '表名';

五、验证分区是否生效

因为使用日期分区,取数据的时候必须加上日期条件,分区才会生效,不加日期就会扫描全表。
验证的方法是随便选个日期,查看执行结果,如果只查询了日期对应的分区就说明生效了。

EXPLAIN 
SELECT * 
FROM 表名
WHERE 日期时间 BETWEEN'2023-12-07' AND'2023-12-10'

-- 随便选个日期,查看执行结果,如果只查询了日期对应的分区就说明生效了。

这里可以看到只查询了选择的日期对应的分区,说明分区生效。

MySQL数据库分区是一种将大型表分解为更小和更可管理的部分的技术。它可以提高查询性能,减少维护时间和成本。以下是MySQL数据库分区的一些方法和步骤: 1. RANGE分区:按照给定的连续范围将数据行分配到分区中。例如,可以按照日期范围将数据行分配到不同的分区中。 2. LIST分区:与RANGE分区类似,但是使用枚举值而不是连续范围来定义分区。例如,可以按照国家/地区将数据行分配到不同的分区中。 3. HASH分区:使用用户定义的表达式计算每个数据行的哈希值,并将数据行分配到哈希值对应的分区中。例如,可以按照客户ID将数据行分配到不同的分区中。 4. KEY分区:类似于HASH分区,但是使用MySQL关键字来计算哈希值。例如,可以按照自增ID将数据行分配到不同的分区中。 以下是一个创建MySQL数据库分区的例子: ```sql CREATE TABLE sales ( id INT NOT NULL, region VARCHAR(100) NOT NULL, country VARCHAR(100) NOT NULL, amount DECIMAL(10,2) NOT NULL, date DATE NOT NULL ) PARTITION BY RANGE(YEAR(date)) ( PARTITION p0 VALUES LESS THAN (2010), PARTITION p1 VALUES LESS THAN (2011), PARTITION p2 VALUES LESS THAN (2012), PARTITION p3 VALUES LESS THAN (2013), PARTITION p4 VALUES LESS THAN MAXVALUE ); ``` 以上代码将sales表按照日期范围分为5个分区。第一个分区包含2010年之前的数据,第二个分区包含2010年的数据,以此类推,最后一个分区包含所有未包含在前面分区中的数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值