1,数据库范式
1.1 第一到第三范式
第一范式 1NF. 保证列的原子性, 一列不能再被分为多个列.
第二范式 2NF. 每行必须可以被唯一地区分. 通常通过加(id)列来实现.
没有包含在主键中的列必须完全依赖于主键, 而不能只依赖于主键的一部分
若有以上情况, 则需要进行表拆分.
第三范式 3NF. 非主键列必须直接依赖于主键, 不能存在递归依赖.
1.2 遵从范式设计的优劣
范式可以避免数据冗余,减少数据库空间,减轻维护数据完整性的麻烦.
范式化的更新操作比反范式更快.
范式的问题是范式的等级越高, 设计出来的表越多, 从而造成操作性能越来越低.
1.3 反范式
反范式允许适当的冗余.
用空间换时间. 把数据冗余在多个表中.
减少查询时的表关联.
单独的表也能使用更有效的索引策略.
2 缓存表和汇总表
2.1 保存冗余数据
提升性能最好的办法是在同一张表中保存衍生的冗余数据.
也可以创建完全独立的缓存和汇总表.
可选择使用实时维护或定期重建, 这依赖于具体的应用程序.
定期重建会节省资源, 保持表不会有太多碎片, 以及完全顺序组织的(高效)索引.
重建时, 使用"影子表(重命名)"来保证数据在重建过程中的可用性.
mysql> drop table if exists sample_new, sample_old;
mysql> create table sample_new like sample;
-- 对sample_new表进行需要的修改.
mysql> rename table sample to sample_old, sample_new to sample.
2.2 物化视图
物化视图�是预先计算并存储在磁盘上的表, 可通过各种策略刷新和更新.
通过提取对源表的更改, 增量地重新计算物化视图的内容. 而不需要通过查询原始数据来更新视图.
优势: 计算增量比从源读取效率高.
2.3 计数器表
要想获得更高的并发更新性能. 可以将计数器保存在多行中.
预先在表中增加N(如100) 行数据.
每次随机选择一行进行更新.
set cnt = cnt+1 where slot = RAND() *100.
获取结果时进行SUM(cnt).
若要每隔一段时间(天)开始一个新的计数器.
primary key(day,slot).
不用预先生成行, 使用 Insert .. ON Duplicate Key Update cnt = cnt +1.
避免表过大
执行一个周期性的任务, 合并结果到0 slot, 同时删除其它的slot.
所有高性能设计的初衷: 更快地读, 更慢地写.
2.4 加快Alter Table操作的速度
Alter Table
过程:
从新的结构创建一个空表.
将旧表所有数据插入新表.
删除旧表.
问题:
耗时, 尤其是当内存不足而表又过大时.
大部分Alter Table操作将导致MySql服务中断.
优化Alter Table的方式
方式1: 在一台不提供服务的机器上执行alter table.然后和提供服务的机器进行切换.
方式2: 影子拷贝. 创建与原本无关的新表, 通过重命名和删除表来交换两种表.
方式3: 为想要的新结构创建新的.frm文件,然后用它替换掉已有的.
修改/删除列的默认值.
使用modify column 命令会重建表,
而alter column 只是修改了.frm文件.
并不是所有的alter table都会引起表重建, 不需要重建表的操作有:
移除列的Auto_Increment属性.
增加/移除/更改Enum和Set常量.
快速创建MyISAM 索引.
为了高效地载入数据到MyISAM表中,可以使用以下方式.
先禁用索引(Disable Keys), 载入数据, 然后重新启用索引(Enable Keys).
在数据加载完毕后, 可通过排序构建索引.
这种方式对唯一索引无效. 这会导致在内存中构造唯一索引, 并为载入的每一行检查唯一性.
最后编辑于 :2017.11.27 04:13:56
©著作权归作者所有,转载或内容合作请联系作者 平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。