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. 分区数量:分区不是越多越好,过多的分区会带来元数据管理的开销。

相关推荐
数字智核36 分钟前
2026昆山工厂空压机突然停机怎么办?找谁抢修
服务器·网络·数据库
AAA代码批发商1 小时前
Days 39 Linux C 开发之 SQLite 数据库完整学习笔记
linux·c语言·数据库
笑梦无境1 小时前
mysql的安装及配置(3)
数据库·mysql·adb
电商API_180079052471 小时前
跨境1688代采商家,如何借助API打通供应链,实现效率跃迁
大数据·数据库·网络爬虫
小雪崩1 小时前
嵌入式学习 day40:数据库
数据库·学习
Aloudata1 小时前
语义层 vs MCP 工具层:Agent 调用数据时,语义应该放在哪一层
数据库·数据分析·chatbi·data agent·语义层
zcmodeltech1 小时前
源网荷储一体化沙盘模型多场景控制系统设计——基于STM32与Modbus RTU的源网荷储、多能互补、冷热电三联供全场景联动方案,服务范围覆盖全国
数据库·人工智能·stm32·单片机·嵌入式硬件
数智启示录1 小时前
PostgreSQL 执行计划实战(第 9 篇):SQL 和索引没变,计划为什么突然慢一百倍
数据库·经验分享·sql·postgresql·面试
Gent_倪2 小时前
MySQL分库、分表、分区详解
数据库·mysql
额额额对了2 小时前
Linux 数据库开发实战:使用 C 语言与 SQLite3 构建轻量级终端词典
linux·数据库·oracle