【数据库优化(持续更新)】--第一弹设计优化

前言

数据库是程序的仓库,也是程序中最脆弱的一部分,因为它的脆弱性和重要性,所以需要专门进行管理和优化。在如今的网络化的时代更加需要数据库的灵活和快捷,一个高效的数据库能够使程序运行效率更快,提高程序的运行效率。但往往对数据库的设计达不到我们想要的效果,所以数据库的优化显得尤为重要。该系列文章正是考虑大数据量的当今如何才能让数据库的设计更加灵活,数据检索、操作更加高效展开的讨论,其中涉及到的优化方法是在笔者长期的开发经验以及其它有关数据库优化的文章基础上进行总结的,如果有异议还请指出。

数据库的优化分为很多种,因为SQL对象较多,在对数据库进行优化时需要考虑它们对性能的影响,而且优化的程度没有最优,只有更优,这些优化方案还要根据使用环境的不同进行取舍,不一定都能保持高效率,你比如说开发的系统本身数据量不大,而且又是C/S系统这时候就可以不用考虑那么多的优化问题,把重心可以放到程序的友好程度、稳定性、健壮性、灵活性上。首先从设计阶段开始考虑数据库的优化,大致的内容进行了整理汇总图,如下。

设计阶段的优化需要有相当多的经验才可以,未雨绸缪才是最高境界,所以要预见性的避免很多问题,在设计时就让数据库查询修改效率很高。

一、规范化

1、数据库的规范化

在创建数据库的时候首先要尽量符合三范式的要求,因为三范式是一个指导性的标准,在复杂的表关系中可以考虑使用范式来达到表之间关系的平衡。在设计表结构时三范式已经很充足了,另外可以考虑增加冗余字段,有时候可以增加检索的效率。

一范式:每个字段表示的实体属性唯一,最基础的设计规范,一般的字段都会符合;

二范式:消除部分依赖;

三范式:消除传递依赖。

如果完完全全按照三范式设计表结构的话,有时候会很繁琐,对于简单的实体转换成表结构的时候可以不采用三范式,因为范式会产生较少的列和更多的表,这样更不利于检索修改,所以要根据实际情况而定。

2、非规范化

合理的冗余

在设计表结构时可以适当的考虑适当的冗余,好的冗余能大大提高表的检索效率。在设计时常用的计算字段(如总计、最大值等)可以考虑存储到数据库实体中,这时可以考虑添加触发器来保持数据的一致性(不建议这样做,触发器有很多不确定性);另外如果设计的表关系产生了许多表但是在检索时需要合并关系,这时可以考虑在数据库实体中添加重复列。

表分割

表的冗余字段可以提高表的效率,同样针对大数据量处理的时候需要考虑对表进行垂直和水平的分割。

(1)垂直分割:把一个实体表分割成两个表。这样把频繁访问的数据同较少被访问的数据分割。在进行分割前要求每张表复制首要关键字。这样产生的表有利于并行处理,将产生列数较少的表。

(2)水平分割:把一个实体表分成多组(把所有的行分成多组)。这种方法适用于那些包含大量数据的实体表。在应用中常要保留历史记录,但是历史记录很少用到,这时额可以把频繁被访问的数据同较少访问的历史数据分割。或者也可以考虑数据备份清空的方式来保证数据的安全性。

二、生成物理

在将生成物理模型时同样需要考虑数据库的优化,本着没有最优只有更优的原则考虑数据库的设计。下面针对数据库中字段和索引优化来展开讨论。

1、 字段

(1)尽量使用数字类型,数字类型查询和操作效率比字符串效率高

(2)字段类型在满足增量需求情况下要选择同种存储类型中最小的,如:能使用smallint类型的字段,不要使用integer,这样索引字段可以被更快地读取,而且可以在1个数据页上放置更多的数据行,因而也就减少了I/O操作。

(3)字段不允许null值,可用Not Null+Default代替

(4)使用text、image类型,或者尽量不用,因为二进制的读写比较慢,而且读取的方法单一

(5)慎用自增字段,不利于数据迁移

2、主键

(1)选用组合字段数最小的候选键,这样在查询的字段较少,提高查询效率

(2)非要使用组合主键的话,将但字段查询中重复率低的放在组合的前方

3、索引

使用索引时也注意一些误区,不是索引越多越好,索引也不等同于主键。在使用时应注意以下原则:

(1)根据数据量决定哪些表需要增加索引,数据量小的可以只有主键;

(2)根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、排序的字段作为索引的候选字段;

(3)把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前面,把重复率低的字段放在前面;

(4)一个表不要加太多索引,因为索引影响插入和更新的速度;

(5)尽可能避免更新聚集索引,因为聚集索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。

结语

设计阶段是数据库开发程序中最重要的一步环节,做好了设计在后期开发的时候才能避免很多错误,这里需要考虑的问题患还有很多,上面的是根据实践经验和翻阅的文章进行总结的,在设计大数据量的访问时会发挥大的作用。

【数据库优化(持续更新)】--第一弹设计优化

时间: 2025-01-17 14:33:54

【数据库优化(持续更新)】--第一弹设计优化的相关文章

关于MYSQL优化(持续更新)

*利用MYSQL数据缓存提高效率,注意事项: 1.应用环境:不经常改变的表及对此表相同的查询 2.不适用于服务器端编写的语句 3.根据数据使用频率,合理分解表 4.合理使用默认条件,提高命中率 5.统一SQL语句编写规范,因为MYSQL解析时区分大小写 6.增加服务器缓存空间 *为查询缓存,优化查询语句: // 查询缓存不开启 $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");

SQL语句效率优化--持续更新

1 delete与in搭配使用,效率特别低,如下可解决该问题,not in同理 /*正常写法*/ DELETE from activity where id in ( SELECT id from activity_data); /*优化后写法*/ DELETE from activity where id in (select * from (SELECT id from activity_data) t); 原文地址:https://www.cnblogs.com/cdut-yy/p/120

nginx(tengine)的一些小优化(持续更新)

1.nginx日志切割脚本 需求来源:nginx本身并没有日志切割的功能,由访问产生的大日志很难进行分析. 实现目的:每天对nginx日志进行切割,并备份至指定文件夹. 简要指令: mv /usr/local/tengine/logs/access.log /usr/local/tengine/logs/access-date.log kill -USER1 Nginx主进程号. 解释: 通过mv命令重命名日志,并且通过kill -USER1 nginx-id的命令,告诉nginx需要写新的日志

自学it18大数据笔记-第一阶段Java-day16-day17-day18-day19--day20-day21-day22——会持续更新

转行大数据领域,没报班,自学试试,能坚持下来就以后好好做这行,不能就--!准备从现有这套it18的视屏残本开始--自学是痛苦的,发博客,算是监督自己,督促自己坚持学下去. (教学视屏是it18做活动送的,虽不全,但徐培成老师讲的真心不错,特此感谢it18掌--帮你们打打广告) 笔记为自学时记录,如有错误,欢迎指正,不胜感激! 笔记分享:自学it18大数据笔记-第一阶段Java-day16-day17-day18-day19--day20-day21-day22--会持续更新-- 第一阶段Java

自学it18大数据笔记-第二阶段Linux-day1——会持续更新……

转行大数据领域,没报班,自学试试,能坚持下来就以后好好做这行,不能就--!准备从现有这套it18的视屏残本开始--自学是痛苦的,发博客,算是监督自己,督促自己坚持学下去. (教学视屏是it18做活动送的,虽不全,但徐培成老师讲的真心不错,特此感谢it18掌--帮他们打打广告) 笔记为自学时记录,如有错误,欢迎指正,不胜感激! 笔记分享:自学it18大数据笔记-第二阶段Linux-day1--会持续更新-- 第一阶段Java-day16-day17-day18-day19--day20-day21

自学it18大数据笔记-第二阶段hadoop-day1——会持续更新……

转行大数据领域,没报班,自学试试,能坚持下来就以后好好做这行,不能就--!准备从现有这套it18的视屏残本开始--自学是痛苦的,发博客,算是监督自己,督促自己坚持学下去. (教学视屏是it18做活动送的,虽不全,但徐培成老师讲的真心不错,特此感谢it18掌--帮他们打打广告) 笔记为自学时记录,如有错误,欢迎指正,不胜感激! 笔记分享:自学it18大数据笔记-第二阶段hadoop-day1--会持续更新-- 第一阶段Linux-day1见: http://t.cn/R6atsEb 第一阶段Lin

持续更新中 --- IOS移动开发中的优质资源

在我们做IOS APP的开发过程中, 需要很多设计, 产品, 技术, 运营等方面的技巧和资源. 现将其整理汇总, 本文会一直持续更新. 敬请关注. 设计 Dribbble Dribbble是一个面向创作家.艺术工作者.设计师等创意类作品的人群,提供作品在线服务,供网友在线查看已经完成的作品或者正在创作的作品的交流网站. 其作品整体质量非常高,许多摄影师.设计师和其他创意产业人士都喜欢在这里展示其未完成的设计,通过与其他设计师的共同探讨来激发自己的灵感. Dribbble还针对手机推出了相应的软件

高并发,大容量,高性能数据库设计优化

1.数据存储 a.集中式---->分布式 复制m/s.切分 a.1切分 垂直切分(按功能模块) 难点:跨域的表关联--->应用程序 事务---------->分布式的事务(单独数据源的小事务,然后通过程序控制) 某些表访问剧增----->读写分离 读写分离(异构数据源之间的读写分离) 相同数据源,只需要master/slave 难点:异构数据源之间的全量复制问题 异构数据源之间的增量同步问题(解析日志) 水平切分(按记录切分---->找规则) a.2 数据切分及整合的中间件

数据库设计优化经验谈

慎用游标(Cursor)  游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机,笔者在某市“住房公积金管理系统”进行日终账户滚积数计息处理时,对一个10万个账户的游标处理时导致程序进入了一个无限期的等待(后经测算需48小时才能完成)(硬件环境:Alpha/4000 128MB RAM ,SCO Unix ,Sybase 11.0).经修改程序并改用UPDAT