10_数据库其它调优策略

系列文章目录

第1章 MySQL系列文章之子查询
第2章 MySQL系列文章之表的操作和约束
第3章 MySQL系列文章之表的视图和存储过程
第4章 MySQL系列文章之逻辑架构
第5章 MySQL系列文章之存储引擎
第6章 MySQL系列文章之索引的数据结构
第7章 MySQL系列文章之索引的创建与设计原则
第8章 MySQL系列文章之索引的性能分析工具的使用
第9章 MySQL系列文章之索引优化与查询优化
第10章 MySQL系列文章之数据库其它调优策略
第11章 MySQL事务和事务日志
第12章 MySQL的锁
第13章 MySQL的多版本并发控制
第14章 MySQL日志和主从复制
第15章 基于Docker的MySQL备份

文章目录

  • 系列文章目录
  • 一、数据库调优的措施
    • 1.1、定位调优问题
    • 1.2、调优的维度和步骤
  • 二、优化MySQL服务器
    • 2.1、升级硬件
    • 2.2、优化参数
  • 三、优化表设计
    • 3.1、优化数据类型
    • 3.2、使用非空约束
    • 3.3、增加冗余字段或增加中间表
    • 3.4、优化表
  • 四、库级优化
    • 4.1、限定查询的范围
    • 4.2、读/写分离
    • 4.3、垂直拆分
    • 4.4、水平拆分

一、数据库调优的措施

1.1、定位调优问题

  • 用户的反馈
  • 日志分析
  • 服务器资源使用监控
  • 数据库内部状况监控
  • 其它

1.2、调优的维度和步骤

1、选择适合的 DBMS:选数据库mysql oracle等

2、优化表设计:要符合第三范式 ,考虑反范式,确定合适的数据类型

3、优化逻辑查询:调整sql语句的写法,优化内容,等价变换,提升效率

4、优化物理查询:对索引的创建和使用
问题:索引的底层原理,数据结构,创建使用删除操作,索引失效场景,该建索引的场景?
5、使用 Redis 或 Memcached 作为缓存:查询响应要求较高的场景(响应时间短,吞吐量大)
问题:数据库和缓存双写一致性如何保证?Redis在业务中的使用?Redis的各种集群部署?各种常见问题?
6、库级优化
主从复制,读写分离,主库负责写,从库负责读;
数据分片,根据模块划分不同的数据库,千万记录的表考虑水平分表(根据时间范围还是哈希来分),字段多考虑垂直分表(冷热字段各建一张表)。
问题:主从同步怎么实现?

二、优化MySQL服务器

2.1、升级硬件

(1) 配置较大的内存
(2) 配置高速磁盘系统
(3) 合理分布磁盘I/O
(4) 配置多处理器

2.2、优化参数

  • innodb_buffer_pool_size :这个参数是Mysql数据库最重要的参数之一,表示InnoDB类型的表和索引的最大缓存。它不仅仅缓存索引数据,还会缓存表的数据。这个值越大,查询的速度就会越快。但是这个值太大会影响操作系统的性能。
  • innodb_flush_log_at_trx_commit :表示何时将缓冲区的数据写入日志文件,并且将日志文件写入磁盘中。为0时,每秒1次的频率将数据写入日志文件并将日志文件写入磁盘。为1时,每次提交事务时将数据写入日志文件并将日志文件写入磁盘进行同步。为2时,每次提交事务时将数据写入日志文件, 每隔1秒将日志文件写入磁盘。

三、优化表设计

3.1、优化数据类型

  • 整数类型的字段可以用 INT 型。INT 型数据有足够大的取值范围,不用担心数据超出取值范围的问题。对于非负型的数据(如自增ID、整型IP)来说,要优先使用无符号整型UNSIGNED来存储。因为无符号相对于有符号,同样的字节数,存储的数值范围更大。如tinyint有符号为-128-127,无符号0-255,多出一倍的存储空间。
  • 既可以使用文本类型也可以使用整数类型的字段,要选择使用整数类型。省空间。
  • 避免使用TEXT、BLOB、ENUM数据类型
  • DECIMAL代替FLOAT和DOUBLE存储精确浮点数

3.2、使用非空约束

在设计字段的时候,如果业务允许,建议尽量使用非空约束

3.3、增加冗余字段或增加中间表

表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。尤其在数据量大,而且需要频繁进行连接的时候,为了提升效率,我们也可以考虑增加冗余字段来减少连接。
或者将经常查询的字段抽取另外再建立一个中间表,通过查询中间表避免重复join查询多张表。

3.4、优化表

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

只能优化表中的VARCHAR 、BLOB 或TEXT 类型的字段。一个表使用了这些字段的数据类型,若已经删除了表的一大部分数据,或者已经对含有可变长度行的表(含有VARCHAR、BLOB或TEXT列的表)进行了很多更新,则应使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片
说明: 在多数的设置中,根本不需要运行OPTIMIZE TABLE。即使对可变长度的行进行了大量的更新,也不需要经常运行, 每周一次或每月一次即可,并且只需要对特定的表运行。

四、库级优化

4.1、限定查询的范围

禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内;

4.2、读/写分离

主库负责写,从库负责读。
10_数据库其它调优策略_第1张图片

4.3、垂直拆分

当数据量级达到千万级以上时,有时候我们需要把一个数据库切成多份,放到不同的数据库服务器上,减少对单一数据库服务器的访问压力。
10_数据库其它调优策略_第2张图片垂直拆分的优点: 可以使得列数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。
垂直拆分的缺点: 主键会出现冗余,需要管理冗余列,并会引起 JOIN 操作。此外,垂直拆分会让事务变得更加复杂。

4.4、水平拆分

10_数据库其它调优策略_第3张图片
水平拆分的方法?用到的工具?
优缺点?

参考:MySQL高级特性篇-宋红康

你可能感兴趣的:(MySQL,数据库,mysql,java)