原文链接:https://www.modb.pro/db/25251 (复制链接至浏览器,即可查看)
常常会问道,怎样使用MySQL能达到高性能 。以下内容是结合其他技术同仁的总结和自我实践整理的20个开源数据库设计原则 。
一、开源数据库架构设计原则 1.1. 技术选型 选择成熟的平台和技术,同时是最熟悉的,能做到极致的,用好不用坏,用熟不用生 。目前业界的MySQL主流分支版本有Oracle官方版本的MySQL、Percona Server、MariaDB 。
1.2. 高可用选择 高可用解决方案的探讨本质上探讨的是低宕机时间解决方案,可以理解为高可用的反面是不可用,绝大部分情况下数据库宕机才会导致数据库的不可用 。随着技术发展,开源数据库方面很多高可用组件(主从复制,半同步,MGR,MHA,Galera Cluster),对应场景,只有适合的,没有万能的,需要理解每个高可用优缺点 。
1.3. 表设计 表设计方面目前为止一致坚持和提倡原则:
- 单表数据量
所有表都需要添加注释,单表数据量建议控制在 3000 万以内 - 不保存大字段数据
不在数据库中存储图片、文件等大数据 - 表使用规范
拆分大字段和访问频率低的字段,分离冷热数据
单表字段数控制在 20 个以内 - 索引规范
1.单张表中索引数量不超过 5 个
2.单个索引中的字段数不超过 5 个
3.INNODB 主键推荐使用自增列,主键不应该被修改,字符串不应该做主键,
如果不指定主键,INNODB 会使用唯一且非空值索引代替
4.如果是复合索引,区分最大的字段放在索引前面
5. 避免冗余或重复索引:合理创建联合索引(避免冗余)
6. 不在低基数列上建立索引,例如‘性别’
7. 不在索引列进行数学运算和函数运算 - 字符集utf8mb4(偏生字,表情符)
文章插图
1.5. 复制方式 MySQL复制方式提供异步方式,半同步方式,全局事务强一致性,binglog同步 。需要不同业务系统间 或 两个数据库间进行同步 。异步方式可以防止故障和效率问题的蔓延,扩大化,但强一致性会更复杂,并发,事务大小都有求限制 。
1.6. 分离原则 区分核心的业务,重要业务,渠道,内部业务的业务系统,对不同的系统设置不同的架构 。为核心业务设置 最佳为分库,多活 专用高速公路,其他业务可以做读写分离,缓存
1.7. 扩展性 对于系统来说扩展性很重要,尽量做到水平扩展 。避免过度依赖纵向扩展,同时具备纵向,横向扩展的能力,例如无状态应用应该多套负载均衡多活部署,数据库分库架构 。
1.8. 读写分离
- 读多写少场景(10%写 90%读)
- 复制存在延迟,业务对延迟不敏感的
- 实现方式:通过应用代码配置读写分离,
通过中间代理方式路由只读库 &
业务和数据库为一个单位
- 当表中数据记录的数量超过3000万条,再好的索引也已经不能提高数据查询的速度,这时需要将表拆分成更多的小表,增加性能,增加弹性,避免发生垮库进行操作 。
- 引入中间价要考虑性能代价,聚合需求 。
- 分库原则尽量在App 上层进行分库,就是流量
- 分多少合适:可用性和性能满足TPS
- 路由:写入配置文件 或则 插表 或则 zookeeper
【20个MySQL高性能架构设计原则】1.11. 连接池的要求 长链接,自动重链,延时和异常记录,弹性链接,检测满,异常告警,进阶要求 是记录所有访问情况,可以扩展出很多能力 。应用和数据库连接池设置,数据库允许的连接数设置,常见问题 。A )应用的数据库连接池设置偏小,一旦数据库相应慢(新上线应用,缺少索引 等)则应 。用排队严重,甚至雪崩,而遗憾的是数据库能力还远为用尽 。B )不具备失效及时发现和重新链接数据库能力 。C )隔离级别设置:RR 和 RC下不同的表现 。
1.12. 应用解耦 通过应用访问数据库而不是直接访问,重要业务不能依赖低保障级别的系统,应用层重要业务和普通业务解耦,关键业务要独立 。
1.13. 组件失效免疫能力 单一应用,单一硬件,甚至单一基础设施,单一站点容灾,业务影响,故障恢复能力,要季度级别进行演练 。
推荐阅读
- MySQL数据库教程-快速理解数据类型
- 用Docker一键快速安装mysql数据库
- Fping - 高性能Ping工具
- 浅谈PHP连接MySQL数据库的三种方式
- mysql5.7使用ProxySQL实现读写分离
- MySQL 安装 MariaDB Audit Plugin 插件,实现审计日志输出
- MySQL使用规范手册,程序员必知必会
- 无语了,直到今天,我才揪出MySQL磁盘消耗迅猛的“真凶”
- IIS+MySQL+PHP+Phpmyadmin配置Web站点之Mysql安装
- Centos7 搭建LTMP环境PHP、Tengine、Mysql、Supervisord、Redis