sql优化进阶

一、基本概念:

1、分区:是将一个大表按照物理维度分割成多个更小、更易管理的部分过程;

2、举例:你有一个包含了数年销售记录的大表sales表,随着时间推移,表的数据量会非常的大,查询和维护成本会非常高,分区相当于给这个表安装了多个抽屉;

  • 逻辑上 :你仍然只有一个sales表,你可以像以前一样SELECT * FROM sales ...

  • 物理上:数据库将数据存储在不同的物理分区中。例如,2023年的数据在一个分区(一个抽屉),2024年的数据在另一个分区。

这样做的好处当你查询2024年某个分区的数据时,数据库可以智能的扫描2024分区的数据,无需对整个表进行扫描,极大的增加了查询性能。

二、分区的主要类型:

2.1、范围分区:

按照某个列的值的范围进行数据划分,一般按照时间和数值进行分区

  • 示例 :按sale_date字段分区。

    • 分区 p2023sale_date < '2024-01-01'

    • 分区 p2024sale_date >= '2024-01-01' AND sale_date < '2025-01-01'

    • 分区 p2025sale_date >= '2025-01-01'

2.2、列表分区:

按照某个列具体的值来划分数据,适用于离散和可枚举的值,如地区、状态

  • 示例 :按region字段分区。

    • 分区 p_eastregion IN ('Shanghai', 'Jiangsu', 'Zhejiang')

    • 分区 p_westregion IN ('Sichuan', 'Chongqing')

    • 分区 p_northregion IN ('Beijing', 'Tianjin')

2.3、HASH分区:

根据数据库对分区键的哈希值来随机分配数据。目的是将数据均匀分布到指定数量的分区中。

  • 示例 :按user_id字段哈希分区。

    • 你指定分成4个分区,数据库会自动计算HASH(user_id) % 4,将数据均匀分配到4个分区中。

2.4、复合分区:

结合上述两种或多种分区策略。例如,先按范围分区,再在每个范围内按列表或哈希分区。

三、实际落地操作:

3.1、范围分区:

sql 复制代码
-- 1. 创建分区表
CREATE TABLE sales (
    sale_id INT NOT NULL,
    product_id INT,
    sale_date DATE,
    amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(sale_date)) ( -- 使用YEAR函数提取年份作为分区键
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p_future VALUES LESS THAN MAXVALUE -- 用于存储超出定义范围的数据
);

执行计划分析:

使用 SELECT * FROM sales PARTITION (p2023) 或者 SELECT * FROM sales WHERE sale_date = '2023-10-20'

EXPLAIN SELECT * FROM sales WHERE sale_date = '2023-10-20';

在执行计划中只扫描了`partitions: p2023`,表示它只扫描了p2023分区

3.2、管理分区:

sql 复制代码
-- 添加新分区(例如为2024年)
ALTER TABLE sales ADD PARTITION (
    PARTITION p2024 VALUES LESS THAN (2025)
);

-- 删除旧分区(这会删除整个分区的数据!请谨慎操作)
ALTER TABLE sales DROP PARTITION p2020;

四、分区的优缺点

优点:
  1. 性能提升 :通过分区裁剪,查询只扫描相关分区,极大减少I/O。

  2. 维护性增强

    • 可以快速删除 整个分区(如删除过期的历史数据),比DELETE操作快得多。

    • 可以对单个分区进行备份、恢复、重建索引等操作,不影响其他分区。

缺点和注意事项:
  1. 设计复杂性:分区键的选择至关重要,选错了可能无法带来性能提升。

  2. 分区键选择:通常只能基于一个或几个列。一旦选定,修改困难。

  3. 潜在性能问题

    • 如果查询条件不包含分区键,可能会导致扫描所有分区,性能可能更差。

    • 主键或唯一键必须包含分区键字段。

  4. 分区数量:分区不是越多越好,过多的分区会带来元数据管理的开销。

相关推荐
运维行者_4 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev5 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1235 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器5 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天6 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
南墙上的石头7 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画8 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc8 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t9 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
执子手 吹散苍茫茫烟波9 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql