数据库优化

数据库优化
数据库:
数据库结构优化
选择合适的数据类型
  • 使用可以存下你的数据的最小的数据类型
  • 使用简单的数据类型。Integer 要比 varchar 类型在 MySQL 中处理更高效
  • 尽可能使用 not null 定义字段
  • 尽量少用 text 类型,非用不可时最好考虑分表
读写分离

    主库:实现增删改业务

    从库:实现查询业务

数据库表的垂直拆分
专库专用
一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指 按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面
  • 把不太常用的字段单独存放到一个表中
  • 把大字段独立存放到一个表中
  • 把经常一起使用的字段放到一起
优点:
        1. 拆分后业务清晰,拆分规则明确。
        2. 系统之间整合或扩展容易。
        3. 数据维护简单。

缺点:
        1. 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。
        2. 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。
        3. 事务处理复杂。
数据库表的水平拆分(有分页,所以水平拆分不多用)
水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说, 我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中
当单表的数据量过大,导致增删查改等操作过慢,这时候需要对表进行水平拆分。水平拆分的表,每一张表的结构都是完全一致的。
优点:
        1. 不存在单库大数据,高并发的性能瓶颈。
        2. 对应用透明,应用端改造较少。     
        3. 按照合理拆分规则拆分,join操作基本避免跨库。
        4. 提高了系统的稳定性跟负载能力。

缺点:
        1.  拆分规则难以抽象
        2. 分片 事务一致性难以解决。
        3. 数据多次扩展难度跟维护量极大。
        4. 跨库join性能较差。
系统配置优化
数据库系统配置优化
数据库是基于操作系统的,目前大多数 MySQL 都是安装在Linux 系统之上,所以对于操作系统的一些参数配置也会影响到 MySQL 的性能,下面列举一些常用到的系统配置。
网络方面的配置,要修改文件 /etc/sysctl.conf
# 增加 tcp 支持的队列数net.ipv4.tcp_max_syn_backlog = 65535# 减少断开连接时,资源回收net.ipv4.tcp_max_tw_buckets = 8000net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 10
打开文件数的限制,可以使用 ulimit -a 查看目录的各项限制,可以修改文件 /etc/security/limits.conf ,增加以下内容以修改打开文件数量的限制
soft nofile 65535hard nofile 65535
除此之外最好在 MySQL 服务器上关闭 iptables,selinux 等防火墙软件。
MySQL 配置文件
MySQL 可以通过启动时指定配置参数和使用配置文件两种方法进行配置,在一般情况下,配置文件位于 /etc/my.cnf 或是 /etc/mysql/my.cnf,MySQL 查询配置文件的顺序是可以通过以下方法过的
常用参数说明
  • innodb_buffer_pool_size:用于配置 Innodb 的缓冲池
    • 如果数据库中只有 Innodb 表,则推荐配置量为总内存的 75%
    • Innodb_buffer_pool_size >= Total MB
SELECTENGINE ,round(sum(data_length + index_length) / 1024 / 1024 ,1) AS 'Total MB'FROMinformation_schema. TABLESWHEREtable_schema NOT IN("information_schema" ,"performance_schema")GROUP BYENGINE;
  • innodb_buffer_pool_instances:MySQL 5.5 中新增参数,可以控制缓冲池的个数,默认情况下只有一个缓冲池。
  • innodb_log_buffer_size:Innodb 日志缓冲的大小,由于日志最长,每秒钟就会刷新,所以一般不用太大。
  • innodb_flush_log_at_trx_commit:对 Innodb 的 IO 效率影响很大。
  • innodb_file_per_table:控制 Innodb 每一个表都使用独立的表空间,默认为 OFF,也就是所有表都会建立在共享表空间中。
  • innodb_stats_on_metadata:决定 MySQL 在什么情况下会刷新 innodb 表的统计信息。
第三方配置工具使用
percona:https://tools.percona.com/
服务器硬件优化
  • 如何选择 CPU
    • MySQL 有一些工作只能使用到单核 CPU,选择高频
    • MySQL 对 CPU 核数的支持并不是越多越快,MySQL 5.5 版本不要超过 32 个核
  • 硬盘 IO 优化
    • RAID 级别简介
    • RAID 0:也称为条带,就是把多个磁盘链接成一个硬盘使用,这个级别 IO 最好
    • RAID 1:也成为镜像,要求至少两个磁盘,每组磁盘存储的数据相同
    • RAID 1 + 0:就是 RAID 1 和 RAID 0的结合。同时具备两个级别的优缺点。一般建议数据库使用这个级别。
    • RAID 5:把多个(最少 3 个)硬盘合并成 1 个逻辑盘使用,数据读写时会建立奇偶校验信息,并且奇偶校验信息和相对应的数据分别存储在不同的磁盘上。当 RAID 5 的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。


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