程序猿必备技能-数据库性能优化
为什么要对数据库性能进行优化?大厅登陆校验服务数据库性能问题导致所有用户持续半个小时的时间无法登陆;
游戏数据库性能问题导致游戏任务异常;
房卡服务数据库性能问题导致无法开房;
优化过后数据库操作就不再是服务的性能瓶颈了吗,为什么?
除了数据库性能外,网络IO、磁盘IO、CPU等都可能导致性能瓶颈;
通常选择关系型数据库就意味着逻辑相对比较复杂;
数据库优化目标:在可预期的范围内满足我们的使用需求;
数据库性能影响因素:硬件能力,IOPS,表结构、SQL、索引
如何设计好的数据库?表结构+SQL+索引
1、表结构:范式和性能的权衡应对需求变化(前瞻性)
2、SQL:查询是否命中索引,存储过程 OR 动态SQL
3、索引:提高查询效率,降低更新/插入效率
表设计-三大范式
第一范式:字段值具有原子性,不能再分。
第二范式:非主属性完全依赖于主属性,而不是只依赖主键的一部分(单一字段作为主键,那么一定满足第二范式)。
第三范式:一个表中不能包含其他相关表中非关键字段的信息,即数据表不能有冗余字段。
三大范式目的:
第一范式---单个字段最小
第二范式---去除主属性冗余
第三范式---去除非主属性冗余
最终目标:高内聚、低耦合、最小空间 --- 应对业务上的变更。
缺点:某些情况下,影响性能。
所以,通常情况下我们尽量满足范式,如果确实有需求,也可以不遵守。
不是你创建了索引,数据库就一定会用-----优化器决定
数据库会有选择的使用多列索引
善用复合索引
索引覆盖性能优势明显
索引的数据结构
页:数据库存储的最小单元;
B+树:是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接;
聚集索引(主键):叶子节点指向真实的表数据
非聚集索引(其他索引):叶子节点保存聚集索引的key值
事务:
优点:原子性、隔离性、一致性、持久性
缺点:性能降低
注意事项:避免死锁、注意事务的隔离等级
参考:https://www.cnblogs.com/fidelQuan/p/4549068.html
https://www.cnblogs.com/knowledgesea/p/3714417.html
**** Hidden Message *****
写在最后:
线上数据库不要轻易做非业务相关的操作,比如:
SELECT COUT(1) FROM XXX;
INSERT INTO SELECT XX FROM XXX;
网上查到的东西,不要看到就当真,比如:
一条SQL语句只会用到一个索引;
WHERE 1=1,会导致索引不可用;
:lol:lol:lol:lol:lol:lol:lol
页:
[1]