数据库优化-单机优化:三范式、反三范式、使用合适引擎

本文介绍了数据库优化的必要性,如高并发、海量数据处理和高可用性需求,并详细阐述了SQL优化的步骤,包括表结构、索引、SQL代码的改进。提到了单机和集群优化的方法,如分表分库、读写分离和使用合适的存储引擎。此外,还讲解了如何通过监控和分析SQL执行情况来定位和解决慢查询问题,以及如何开启和使用慢查询日志。文章最后讨论了数据库设计中的范式理论和反范式设计,以及如何根据业务场景选择适合的存储引擎。

优化关系型的数据库原因:

  • 1、高并发读写需求 购物双11 亿人一起浏览下单,一台数据库最大连接数是有限的,这时候就需要集群和分布式。
  • 2、海量数据的高效率读写,比如京东的商品用户等,每一张表有上亿条数据的时候,读写效率比较低,这时候就需要采用分表分库
  • 3、动态添加服务器一台数据库服务器扩充到多台时,不下电情况是很难做到的。
    单点故障:一台数据库服务器挂了。业务就中断,期望去找还好的数据库继续提供服务。这时候就需要数据库的高扩展性和可用性,可以采用集群优化。

优化sql的步骤

  • 定位慢sql
  • 分析慢sql
  • 给出解决方案(优化)
    优化方案
  • 单机(表结构、索引、Sql(代码问题)):

    合适表结构 3NF和反3NF
    合适引擎
    索引
    分表(垂直分表和水平分表)
    Sql优化技巧
  • 多机(IO瓶颈):
    集群(读写分离,让多台服务器提供服务)
    分布式(把不同的业务分给不同的集群处理)
  • 其他优化方案
    缓存 es 页面静态化

- 测试:

  • 准备两个数据库400万数据进行测试

- 查询数据库(mysql)基本状态
运行多久

  • show status like ‘uptime’;

  • CRUD执行次数

  • show status like ‘%Com_%’

  • CRUD次数
    show status like ‘%Com_select%’
    show status like ‘%Com_insert%’
    show status like ‘%Com_update%’
    show status like ‘%Com_delete%’

  • Show session/global status like ‘%Com_select%’
    show [session|global] status like … 如果你不写[session|global] 默认是session 会话(指取出当前窗口的执行),如果你想看所有(从mysql 启动到现在),则应该 global。

  • 查询所有连接数
    show status like ‘connections’

  • 查看服务器响应的最大连接数
    show status like ‘Max_used_connections’

  • 通过查询(工作环境)最大并发连接数可以配置作为我们配置mysql最大连接数的依据。通常,mysql的最大连接数默认是100, 最大可以达到16384(理论上)。

  • 查询慢查询次数
    show status like ‘slow_queries’

  • 查看和修改慢查询时间阈值
    show variables like ‘long_query_time’ //可以显示当前慢查询时间
    set long_query_time=1 ;//可以修改慢查询时间
    set GLOBAL long_query_time=0.6;全局修改慢查询时间
    注意:
    直接修改global 的long_query_time 之后在当前的的窗口中是没有效果的,在新打开的窗口中才会有效果。如果想让本窗口也有效果 的话,不用加 global关键字。

  • 把慢查询记录到日志中
    bin\mysqld.exe --safe-mode --slow-query-log [mysql5.5 可以在my.ini指定]
    注意事项:
    1 必须在mysql的安装目录执行,因为执行的使用依赖于my.ini(C:\Program Files\MySQL\MySQL Server 5.7),
    2 慢查询日志会输出到data.dir(datadir=C:/ProgramData/MySQL/MySQL Server 5.7\Data)

什么时候开启慢查询?

         系统中所有sql都执行一遍,才能判断是否有慢sql。什么时候开启能覆盖所有sql执行?
      开发者自验:
           开发完成后,需要统一打包,统一部署,统一验证。
      测试人员测试:
           测试人员需要测试所有功能。
      项目上线:开一段时间,把它关了.或者不开
           用户用了所有功能。

explain(分析sql语句)

explain sql语句;
EXPLAIN select * from emp WHERE empno=4099030;

通过 explain 语句可以分析,mysql如何执行你的sql语句.

在这里插入图片描述
在这里插入图片描述
找到原因以后就解决

一、单机优化

遵循三范式

1NF:表的列具有原子性,不可再分解。
即列的信息,不能分解.只要数据库是关系型数据库(mysql/oracle/db2/sysbase/sql server),就自动的满足1NF.关系型数据库中是不允许分割列的。

  • 2NF: 表的记录是唯一的,我们使用主键来实现。
  • 3NF:表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放

设计合适的反三范式:

反3NF :没有冗余的数据库表未必是最好的数据库表,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

  • 比如浏览次数、评论次数等,为了提高效率,直接在在外键表添加浏览数。方便查询!
  • 注意:当一个表数据发生改变是冗余字段也需要发生改变,可以使用触发器,提高效率,不用操作两个或者多个表。使用CREATE TRIGGER 来创建触发器。这里就不多说了,百度很多案例。。。
    数据库触发器:https://www.cnblogs.com/zh-1721342390/p/9602941.html

二、使用合适的存储引擎 --创建表时要选择存储引擎

mysql常用的几种数据库引擎:myisam,innodb,memory
1)优缺点
MyISAM 和 INNODB以及memory的区别(主要)

  1. 事务安全 MyISAM不支持事务,INNODB支持,memory不支持事务
  2. 查询和添加速度 MyISAM速度快,INNODB速度慢,memory速度快
  3. 支持全文索引 MyIsam支持,innodb不支持
  4. 锁机制 MyIsam表锁 innodb行锁
  5. 外键 MyISAM 不支持外键约束, INNODB支持外键. (通常不设置外键,通常是在程序中保证数据的一致)
    在这里插入图片描述
    2)使用场景
  • MyISAM存储引擎
    如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. 比如 bbs 中的 发帖表,回复表.

  • INNODB存储引擎:
    对事务要求高,保存的数据都是重要数据,我们建议使用INNODB,比如订单表,账号表.

  • Memory 存储
    比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快.

使用引擎

  • 创建表时指定存储引擎
    Create table 表名(字段列表) engine 存储引擎名称;
    在这里插入图片描述

注意:如果不指定则使用默认的存储引擎,这个默认实在my.ini配置
在这里插入图片描述

  • 修改存储引擎:
    alter table table_name engine=innodb;
## 一、核心研发工作清单 ### 1. 预测业务逻辑设计 ### 1.1 预测目标定义 **必须明确:** - 预测什么:胜负、胜平负、比分、让球盘 - 何时预测:赛前24小时、赛前1小时、实时更新 - 输出形式:确定性结果、概率分布、置信区间 **为什么框架无关:** 无论用什么模型,预测目标是前提条件。XGBoost和神经网络都需要先定义预测任务。 **为什么必须做:** 预测目标决定了特征选择、模型设计、评估标准的全部方向。 ### 1.2 用户场景的业务流程设计(用户体验) **场景设计:** - 场景1”今晚看什么”:如何定义”值得看”,召回策略,排序因子 - 场景2”这场谁会赢”:实体识别逻辑,歧义处理规则,预测调用流程 - 场景3”为什么”:上下文引用规则,解释内容深度控制 +推荐场景、预测场景、解释场景、对比场景、趋势与状态场景、澄清与多轮对话场景、数据探索场景(重用户需求)、资讯场景、异常流程处理 ### 1.3 异常场景的业务策略 **必须定义:** - 预测服务不可用时如何降级 - 数据缺失时如何处理 - 新球队、新联赛如何冷启动 - 用户输入歧义时如何澄清 --- ### 2. 数据建模 ### 2.1 实体关系模型设计 - 核心实体:Match、Team、League、TeamStats、H2H - 实体间关系:一对多、多对多、自关联 - 关键字段:主键、外键、时间戳、状态字段 - 数据范式:第几范式,是否范式化 ### 2.2 特征体系定义(预测效果) - 基础特征:近N场胜率(N取多少?为什么?)、主客场表现、进失球数 - 衍生特征:近期势头、对阵克制度、赛程疲劳度 - 特征计算逻辑:如何避免数据泄露、如何处理缺失值 - 特征验证方法:相关性分析、重要性评估、消融实验 ### 2.3 数据质量标准(模型稳定性) - 完整性要求:哪些字段必填,缺失率阈值 - 一致性规则:比分与结果的逻辑校验、时间合理性检查 - 异常值检测:统计阈值定义、业务规则校验 - 更新时效性:赛后多久必须更新结果、数据延迟的SLA --- ### 3. 预测算法设计 ### 3.1 评估体系设计 - 准确性指标:Accuracy、Precision、Recall、F1、LogLoss - 概率校准指标:Calibration Curve、Brier Score - 长期稳定性指标:滚动窗口准确率、不同联赛表现差异 - 业务指标:预测覆盖率、用户信任度、解释满意度 ### 3.2 可解释性机制设计 - 特征贡献到自然语言的映射规则 - 解释内容的层次设计:简明结论、关键因素、详细数据 - 不确定性的表达方式:如何诚实表达概率 - 解释质量的评估标准 ### 3.3 模型失效检测机制(系统健壮性) **必须定义:** - 失效信号:准确率持续下降、概率校准度恶化、异常案例激增 - 触发阈值:下降多少触发报警、连续多久触发重训练 - 响应策略:降级、报警、人工介入、模型回滚 --- ### 4. 对话交互系统设计 ### 4.1 意图分类体系(对话系统的核心逻辑-4.3) - 支持的意图类型:查询、预测、推荐、分析 - 意图的层级结构:一级意图、二级细分 - 边界场景处理:意图不明确、多意图混合、超出能力范围 - 意图识别的置信度阈值 ### 4.2 实体识别与标准化 - 实体映射库:球队别称、联赛简称、时间表达 - 标准化规则:如何将多种表达映射到标准实体 - 歧义消解策略:当”曼联”可能指多个实体时如何处理 - 模糊匹配容忍度:拼写错误的容忍程度 ### 4.3 上下文管理策略 - 上下文状态结构:当前话题、历史消息、用户画像 - 引用规则:代词消解、省略补全、话题切换检测 - 过期策略:时间TTL、话题切换清空、用户主动重置 - 上下文引用的优先级:最近话题优先还是明确实体优先 ### 4.4 对话降级策略 - 无法识别意图时的处理:提供引导菜单还是问澄清 - 实体无法识别时的处理:主动澄清还是模糊匹配 - 查询无结果时的处理:告知无结果还是推荐相关内容 - 服务失败时的处理:降级到规则推断还是诚实告知 --- ### 5. 推荐系统策略设计 ### 5.1 推荐目标定义 **必须明确:** - 优化目标:最大化点击率、观看率、满意度 - 约束条件:时效性、数据可靠性、预测支撑 - 评估指标:推荐点击率、用户满意度、多样性 ### 5.2 召回与排序规则 **必须定义:** - 召回策略:基于用户偏好、基于比赛热度、基于预测特征、基于时间 - 排序因子:兴趣匹配、比赛精彩度、比赛重要性、时间便利性 - 权重分配:各因子的权重如何确定 - 多样性控制:如何避免推荐单一类型 ### 5.3 冷启动策略 **必须定义:** - 新用户:如何快速建立画像、默认推荐策略 - 新比赛:如何在缺少历史数据时推荐 - 画像构建:需要多少交互数据才能建立有效画像 **为什么框架无关:** 冷启动是所有推荐系统都要面对的问题,与技术选型无关。 **为什么必须做:** 冷启动处理不好会导致新用户流失。 --- ### 6. 系统架构设计 ### 6.1 服务职责划分 - 每个服务的职责边界:数据服务、预测服务、对话引擎、推荐服务 - 服务间的调用关系:谁调用谁、数据如何流转 - 职责不重叠原则:避免功能重复 - 服务拆分粒度:多细才合理 ### 6.2 接口契约设计 - 接口输入输出格式:JSON schema定义 - 错误码体系:成功、失败、各种异常的标准错误码 - 接口版本管理:如何向后兼容 - 接口幂等性:同样的请求多次调用结果一致 **为什么必须做:** 接口契约不清晰会导致集成困难、问题排查困难。 ### 6.3 容错与降级机制 **必须定义:** - 每个服务的降级策略:完全不可用、响应超时、部分功能失效 - 超时与重试策略:超时时间、重试次数、重试间隔 - 服务熔断机制:多少次失败后熔断、如何恢复 - 降级后的用户体验:如何保证体验连续性 ---这份预案是可脱离架构或选型的任务吗?放在体育赛事智能系统中来看
最新发布
11-19
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜甜掉在星星上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值