数据量过大SQL优化

目录

前言:

1.索引

1.1 MySQL索引

1.2 B+Tree(具有唯一列的普通索引)

1.3 哈希索引

1.4 全文索引

2.索引优化

3.分库分表

3.1分库不分表

 3.2分表不分库

3.3 分库又分表

3.4 逻辑分区

3.NoSQL

2.1 数据压缩

2.4 数据预处理与去重


前言:

随着数据量的不断增加,数据量过大会造成性能瓶颈,尤其是 线上服务 中,大量数据的实时处理和查询会直接影响到 响应时间 系统稳定性。当数据量达到一定规模时,数据库,网络带宽,以及线上资源都可能成为系统的瓶颈,从而导致响应延迟,处理效率低下。因此,如何高效地管理和优化大数据量,确保接口响应时间高可用性,可以有效的提升系统性能和用户体验的关键。

1.索引

1.1 MySQL索引

索引是在存储引擎层实现的,而不是在服务层实现的,所以不同的存储引擎有不同的索引类型和实现(InnoDB/myisam,mysql 5.5之后/之前)

Innodb 默认使用聚簇索引(主键索引):数据表中的行数据会按照主键的顺序进行物理存储

1.2 B+Tree(具有唯一列的普通索引)

大多数情况下采用B+ Tree 来进行,因为不需要进行全表扫描,只需要对树进行搜索即可,所以查找速度快很多。

B+Tree有序,所以除了用于查找,还可以用于排序和分组。

可以指定多个列作为索引列,多个索引列共同组成键(联合索引)。如果不是按照索引列的顺序进行查找,则无法使用索引。

InnoDB的B+Tree分为主索引和辅助索引。主索引的叶子节点data域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一张表只能有一个聚簇索引。

辅助索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先找到主键值,然后再到主索引中进行查找

1.3 哈希索引

哈希索引能以 O(1) 时间进行查找,但是失去了有序性:

无法用于排序与分组

只支持精确查找,无法用于部分查找和范围查找

InnoDB ‘自适应哈希索引’,当某个索引值被使用的非常频繁时,会在B+Tree索引上在创建一个哈希索引,这样B+Tree索引具有哈希索引的一些优点,比如快速的哈希查找。

1.4 全文索引

MyISAM存储引擎支持全文索引,用于查找文本中的关键字,而不是直接比较是否相等

查找条件使用 MATCH AGAINST,而不是普通的 WHERE

全文索引使用倒排索引实现,它记录着关键词到其所在文档的映射

InnoDB 存储引擎在 5.6.4中也开始支持全文索引

1.5 空间数据索引

MyISAM 存储引擎支持空间数据索引(R-Tree),可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。

必须使用 GIS 相关的函数来维护数据。

2.索引优化

1. 范围查询:idx (a, b, c) ,要使用 betweend 或者 > <,该字段需要放在最后(c)。因为当所有中有范围查询,之后的索引就无法使用了。

2. 索引列的顺序:选则性最强的索引列应该放在最前面 选择比 = 索引列的唯一值数目 / 总行数。选则性越高,每个记录的区分度越高,查询效率也越高。

3. 前缀索引:适用于字符串,比如前10个字符,只索引开始的部分字符

4. 聚合索引:索引包含所有需要查询的字段的值。

优点:

适用于读取频繁,但写入较少的

避免回表(回表指当查询条件使用了索引,但查询的字段不完全包含在索引中的情况下,数据库必须先通过索引获取主键,再访问数据表获取其他字段。回表的过程会消耗额外的时间和I/O)

缺点:索引较大,维护成本高,适用于读多写少的场景。

3.分库分表

分库分表分为物理分区和逻辑分区

区别物理分区逻辑分区
定义数据在物理层面上的分割和存储数据在应用层或逻辑层面上的划分和组织
关注点数据的实际存储位置和分布数据的组织和访问方式
实现方式数据按照某些规则分散存储到不同的数据库、表中数据以业务逻辑为基础进行虚拟化分区
透明性需要应用程序和数据库管理系统了解分区规则应用程序通常不需要关心分区细节
扩展性物理分区通过增加硬件来实现扩展逻辑分区通过修改逻辑层来实现扩展
路由机制物理路由:根据规则定位数据的物理存储位置逻辑路由:根据业务规则定位数据逻辑位置
举例按ID范围分表,按地区分库订单表、用户表按时间、区域、ID等分区
3.1分库不分表

 3.2分表不分库

3.3 分库又分表

3.4 逻辑分区

样例中fq为column,根据该字段进行分区

样例

ALTER TABLE `test_sales`
PARTITION BY RANGE (`fq`) (
    PARTITION p202101 VALUES LESS THAN (202101),
    PARTITION p202102 VALUES LESS THAN (202102),
    PARTITION p202103 VALUES LESS THAN (202103)
);

 动态添加

ALTER TABLE `test_sales`
ADD PARTITION (
    PARTITION p202108 VALUES LESS THAN (202108)
);

删除分区

ALTER TABLE `test_sales`
DROP PARTITION p202101; 

4.NoSQL

NoSQL 比 SQL 快的原因主要归结于以下几点:

  1. 简化的数据模型:避免了复杂的表连接和数据规范化。

  2. 灵活的数据模式:无需预定义模式或表结构。

  3. 水平扩展:通过分布式架构和分片提高性能和可伸缩性。

  4. 优化特定场景的查询:如缓存、全文搜索、列式存储等。

  5. 最终一致性:牺牲一致性以获得更高的吞吐量和可用性。

  6. 低延迟、高并发:内存存储和优化的查询方式。

5. 数据处理与计算优化

5.1 数据压缩

对于大量存储的数据,可以进行压缩,减少存储空间的消耗,如聚合后创建副本,定时任务根据数据推送时间定期维护副本数据。

5.2 数据预处理与去重

        1. 去重:对于重复的数据(例如重复记录、冗余数据),需要提前进行去重操作,减少无效数据的存储和计算。

        2. 数据清洗:通过去除噪声数据、填补缺失值、标准化格式等步骤清洗数据,提高后续计算效率。

补充:

1. 当拥有足够权限时,可以考虑根据需求,自行聚合出自建表副本,聚合后的数据可以有效减少数据量,优化响应时间

2. 如果你的数据量非常大,网络也可能会成为你的瓶颈,需要考虑到带宽对执行时间的影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值