数据库调优的目标
让数据库运行得更快,也就是说响应的时间更快,吞吐量更大。
调优维度:
用户的反馈
日志分析
服务器资源使用监控
数据库内部状况监控:活动会话(Active Session)监控,事务、锁监控
调优方式:
1.选择适合的 DBMS:sql或者nosql
2.优化表设计
表结构要尽量遵循第三范式的原则,
如果分析查询应用比较多,尤其是需要进行多表联查的时候,可以采用反范式进行优化。反范式采用空间换时间的方式,通过增加冗余字段提高查询的效率。
表字段的数据类型选择,关系到了查询效率的高低以及存储空间的大小。一般来说,如果字段可以采用数值类型就不要采用字符类型;字符长度要尽可能设计得短一些。针对字符类型来说,当确定字符长度固定时,就可以采用 CHAR 类型;当长度不固定时,通常采用 VARCHAR 类型。
3.优化逻辑查询【优化sql】
SQL 查询优化,可以分为逻辑查询优化和物理查询优化。逻辑查询优化就是通过改变 SQL 语句的内容让 SQL 执行效率更高效,采用的方式是对 SQL 语句进行等价变换,对查询进行重写。重写查询的数学基础就是关系代数。
SQL 的查询重写包括了子查询优化、等价谓词重写、视图重写、条件简化、连接消除和嵌套连接消除等。多表关联改成单独sql进行数据拼装。
EXISTS 子查询和 IN 子查询的时候,会根据小表驱动大表的原则选择适合的子查询。在 WHERE 子句中会尽量避免对字段进行函数运算,它们会让字段的索引失效。
4.优化物理查询【建索引】
数据重复度高,就不需要创建索引;where语句字段函数计算不走索引。联合索引对索引使用的影响
要注意多个索引对索引使用的影响。索引不是越多越好,因为每个索引都需要存储空间,索引多也就意味着需要更多的存储空间。此外,过多的索引也会导致优化器在进行评估的时候增加了筛选出索引的计算时间,影响评估的效率。
5.使用 Redis 或 Memcached 作为缓存
6.库级优化:分库分表,读写分离。 MySQL 自带的分区表功能,也可垂直或水平切分
7.硬件升级
image.png
三范式:
1NF 需要保证表中每个属性都保持原子性
2NF 需要保证表中的非主属性与候选键完全依赖
3NF 需要保证表中的非主属性与候选键不存在传递依赖
1NF 指的是数据库表中的任何属性都是原子性的,不可再分。
对象(表)的每个属性(字段)都不可再分。
2NF 指的数据表里的非主属性都要和这个数据表的候选键有完全依赖关系【外键、中间表】
一个对象(表)包含另一个对象(表)用外键完全依赖;对象(表)和对象(表)之间关系用第三个对象(中间表)关联,非主属性(字段)只能直接依赖于主键。
避免数据冗余导致增删改异常
3NF 在满足 2NF 的同时,对任何非主属性都不传递依赖于候选键。
也就是说不能存在非主属性 A 依赖于非主属性 B,非主属性 B 依赖于候选键的情况。
反范式
范式等级越高,设计出来的数据表就越多,进行数据查询的时候就可能需要关联多张表,从而影响查询效率。
有时候为了查询快速,建立冗余字段。通过空间来换取时间。
评论表连用户表查询在数据量大的情况下比较耗时,可在评论表存储用户名(最好是用户名不可修改),这样就是反范式。
如果字段经常变动,则要用触发器,存储过程,或者脚本自动执行更新实现同步。
image.png
image.png
网友评论