首页 > 代码库 > 优化数据库对象
优化数据库对象
procedure analyse()
优化表的数据类型 使用procedure analyse()对当前应用的表进行分析
select * from table_name procedure analyse();
select * from table_name procedure analyse(16,256);
第二个语句告诉procedure analyse()不要为那些包含的值多余16个或者256个字节的ENUM类型提出建议
select * from rental procedure analyse()\G;
File_name | 列的名字 |
Min_Value | 列种的最小值 |
Max_Value | 列中的最大值 |
Min_length | 列种值最小的长度 |
Max_length | 列中值最大的长度 |
Optimal_fieldType | 给出的建议 |
拆分提高表的访问效率
垂直拆分
如果一个表中某些列常用,而另一些列不常用,则可以采用垂直拆分。
垂直拆分的优点
垂直拆分可以使数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。
缺点
需要管理冗余列,查询所有数据需要join操作。
水平拆分
根据一列或者多列数据的值把数据行放在两个独立的表中
优点
表很大,分割后可以降低在查询时需要读的数据与索引的页数,同时也降低了索引的层数,提高了查询的速度。
表中的数据本来就有独立性,例如:表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用
缺点
需要把数据存在多个介质上
水平拆分会给应用增加复杂度,查询所有的数据需要UNION操作。
逆规范化
规范化:
规范化越高,那么产生的关系就越多,关系越多的直接结果就是导致表之间的连接操作越频繁。表之间的连接操作是性能较低的操作,直接影响到查询的速度。
反规范化:
反规范的好处是降低连接操作的需求,降低外键和索引的数目,还可能减少表的数目。加快查询速度,但会降低修改速度。
反规范化分类:
增加冗余列
多个表中具有相同的列,常用来在查询时避免连接操作
派生列
增加的列来自其他表的数据,其他表中的数据是经过计算生成。作用是在查询时减少连接操作,避免使用集函数
重新组表
如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能
分割表
垂直分割与水平分割
维护反范式数据的完整性常用方法
批处理
批处理维护是指对复制列或者派生列的修改累积一定时间后,运行一批处理作业或者存储程序对复制列或派生列进行修改,只能在对实时性要求不高的情况下使用
应用逻辑
数据的完整行也可由应用逻辑来实现,这就要求必须在同一事务中对所有涉及的表进行增,删,改操作,用应用逻辑来实现数据的完整性风险性大,因为在同一逻辑必须在所有的应用中使用和维护,容易遗露,特别是在需求变化时,不易于维护。
触发器
对数据的任何修改立即触发对复制列或派生列的相应修改,触发器是实时的,而且相应的处理逻辑只在一个地方出现,易于维护。一般来说,是解决这类问题比较好的办法
使用中间表提高统计查询的速度
对于数据量大的表,在其上进行统计查询通常效率低,并且还要考虑统计查询是否会对在线的应用产生影响。在这种情况下,使用中间表可以提高统计查询的效率,
优点
中间表复制原表部分数据,并且与原表相隔离,在中间表上做统计查询不会对在线应用产生负面影响。
可以灵活地添加索引,增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询的作用
优化数据库对象