MYSQL数据库表设计与优化(一)
来源:Asp之家 发布时间:2010-10-25 19:50:00
优化糟糕设计的表结果或者索引能很大程度改进mysql的性能。 如果需要高性能, 那么就需要根据不同的操作需求精心设计表结构和索引, 这当然需要对各种查询做出性能需求评估, 因为改变一个查询或者一部分表结构设计会在其他地方引的性能。 优化通常需要做出取舍, 例如, 通过增加索引来加速查询速度会减慢修改速度; 类似的, 一个非完全按范式设计的表结构能使某些查询速度提高, 但可能会导致其他的效率降低; 增加计数器或者汇总表能有效的优化一些查询, 但是维护代价也是不菲的。
有时候, 作为开发人员的你需要做超出开发人员职责的事情去弄清楚递到你面前的开发任务, 有时候, 那些不太了解数据库系统原理的人提出的需求可能不会考虑需求的性能影响, 如果你能清楚的告诉他们这些对数据库造成大压力的小功能需要导致硬件成本成倍增加的话, 他们可能会考虑砍掉一些需求。
表设计和索引优化要求设计开发人员了解系统构架和实现细节, 设计人员需要去理解整个系统和可能的各种影响因素。 这一章依次重点讨论数据类型, 索引策略和范式化, 最后对一些数据引擎做一些简单的介绍。
Choosing Optimal Data Types
选择正确的数据类型
Mysql 提供多种数据类型的支持,选择正确的数据类型对能否得到高性能的设计影响很大。 以下一些简单的指导规则能帮助您对各种数据类型的设计决策做出更好的选择:
小的比大的好
一般来说, 在保证正确性的前提下, 尽量使用最小的数据类型来存储和表示数据。 小的数据类型一般比大的更快, 因为小的数据类型占用的磁盘空间, 内存和cup缓存都相对小, 需要的cpu处理也要相对少; 这个原则很重要, 但是设计的时候也不要低估需要存储的数据的数据范围, 毕竟, 如果后来发现需要在多个地方改变某个数据的数据类型的话, 将是一件痛苦耗时的事情。 如果正在多个可选数据类型之间犹豫不绝的话, 就选那个能够满足数据范围需求的最小的数据类型吧(如果系统比较简单, 数据量不大,或者正处于早期设计阶段, 后面是很容易修改的)
简单的就是好的
简单的数据类型需要的cup处理周期更少, 比如, 对整数的处理比字符串处理更容易, 因为字符集和排序规则使得字符串比较复杂化了, 两个典型例子是: 使用mysql的内嵌数据类型来存储日期和时间而不是字符串, 使用整数存储Ip地址而不是字符串。 后面会对更详细的讨论这条规则。
尽量避免NULL数据类型
如果可能, 尽可能把字段定义成NOT NULL。 许多表包含一些字段允许空的字段, 即使应用需求不需要存储null的数据, 这样做的原因知识因为允许字段为NULL是缺省的。您应该注意把字段设计生非NULL的, 除非真的是需要存储NULL值。 在查询优化时, mysql很难优化需要引用到能包含NULL值的字段的查询, 因为允许为null的字段使得索引, 索引统计和值比较更复杂。
允许NULL的字段会占用掉更多的存储空间和花掉更多的cpu处理, 当为一个可为空的字段建立索引时, 需要为每项分配一个额外的字节, 在myisam中, 甚至会使得一个固定大小的索引(比如建立在单个整数的缩影)变成一个变长大小的索引。 即使遇到不需要存储值到某个字段, 也应当考虑不使用NULL, 而是考虑使用0, 一个特殊值或者空串来代替。 把字段从NULL改成NOT NULL的性能改善通常不是很大, 所以, 除非确实证明NULL字段在引起性能问题, 一般不需要把超找并修改NULL字段为NOT NULL字段当做一件大事来对待; 但是, 在做设计的时候, 注意尽量把需要索引的字段设计成不允许为空的。
猜你喜欢
- 目前可实现:MD5算法、SHA256算法、先MD5后SHA256、先SHA256后MD5、两次MD5、两次SHA256、前8位MD5算法后8
- 常见的SQL问题:◆选择重复,消除重复和选择出序列有例表:empemp_no name age001 Tom 17002 Sun 14003
- 英语原文地址:点此浏览新年开始了,来点猛料,放上15个漂亮的网页排版的demo,来欣赏一下。去年我也专门找了15个同类网站,比较受用户欢迎,
- 在计算机信息技术中,少有象类似 XML 那样的技术,她让人们产生范围很大的联想,而这些联想及其应用又可能相距甚远。她也更多引起人们对 XML
- 最近在做一个魔术网的div+css切割,昨晚发现了长期以来一直无记录下来的问题!关于兼容IE跟FF的float属性。趁现在还清醒赶紧记下笔记
- 摘 要:本文讨论了Visual Basic应用程序访问SQL Server数据库的几种常用的方法,分别说明了每种方法的内部机理并给出了每种方
- 以前没见过这个效果,滚动纵向滚动条看看效果就明白了这样的效果,广告商应该比较喜欢。<!DOCTYPE html PUBLIC &quo
- 问:如何自己制作验证码的head.fix和body.fix文件答:1 图象绘制完成后,将文件存为24位位图格式的BMP图象文件。 2 去除前
- 现在介绍加速网页图形显示速度的六种方法,为你解决这个难题。其最基本的宗旨就是,让你用买鱼的价钱,品尝到熊掌的美味和营养。 1.首先要确定图像
- 一张表(ColumnTable)的结构如下图所示当前需要实现的功能:通过Number的值为67来获取当前的节点ID、父节点ID递归实现SQL
- 项目有时要用一些Ajax的效果,因为比较简单,也就没有去用什么Ajax.net之类的东西,手写代码也就实现了。、第二天,有人反馈错误;说是只
- 您可以使用 ObjectContext 对象提交或放弃一项由 Microsoft Transaction Server (MTS) 管理的事
- 定义总是很抽象。存储进程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL SERVER)。如果我们
- Debug Textarea这个东西是在线写 js 脚本的时候,用来即时查错的东西!也就是,当发现所编写的脚本有问题的时候会有相应的提示,并
- 一、图像缩略图的编辑图像的缩略图是指把图像按原比例缩小,可作为原图的预览,这在网络速度比较慢时可快速地显示图片的概图。当你的网页上有大型图片
- 如何用ASP获知机器的网络配置?看看我们的例子:Option Explicit Dim WSHShell&nb
- 4款JavaScript放大镜特效脚本。准确的说,Anythingzoomer和Bezoom才是正宗的放大镜特效,当鼠标悬浮在图片上时,能放
- 代码如下: var lishustr = "qwertyuiopasdfghjklmnbvcxz"; var s = l
- 本文列举了兼容 IE 和 FF 的换行 CSS 推荐样式,详细介绍了word-wrap同word-break的区别。兼容 IE 和 FF 的
- 往往我们在建立一个较为大型的网站的时候会有很多的副页面框架模式甚至一些小的细节元素都是相同的,但是令人困扰的是在更新它们时却要费些周折,要一