第二个灵魂 发表于 2015-1-16 20:10:34

发一篇MySQL的数据范例和建库战略

人们常说“成功孕育成功”,这种说法明显非常适合MySQL的情况。MySQL学习教程这个开源数据库号称在全世界有超过110万份的完全安装。不管是在小得不幸的收费数据库空间或是年夜型电子商务网站,公道的计划表布局、充实使用空间是非常需要的。这就请求我们对数据库体系的经常使用数据范例有充实的熟悉。上面我就将我的一点心得写出来跟人人分享。

1、数字范例。数字范例依照我的分类办法分为三类:整数类、小数类和数字类。
我所谓的“数字类”,就是指DECIMAL和NUMERIC,它们是统一品种型。它严厉的说不是一种数字范例,由于他们实践上是将数字以字符串情势保留的;他的值的每位(包含小数点)占一个字节的存储空间,因而这类范例泯灭空间对照年夜。可是它的一个凸起的长处是小数的位数流动,在运算中不会“掉真”,以是对照合适用于“代价”、“金额”如许对精度请求不高但正确度请求十分高的字段。
小数类,即浮点数范例,依据精度的分歧,有FLOAT(单精度)和DOUBLE(双精度)两种。它们的上风是准确度,FLOAT能够暗示相对值十分小、小到约1.17E-38(0.000...0117,小数点前面有37个零)的小数,而DOUBLE更是能够暗示相对值小到约2.22E-308(0.000...0222,小数点前面有307个零)的小数。FLOAT范例和DOUBLE范例占用存储空间分离是4字节和8字节。假如必要用到小数的字段,精度请求不高的,固然用FLOAT了!但是说句其实话,我们“平易近用”的数据,哪有请求精度那末高的呢?这两品种型至今我没有效过――我还没有碰到合适于利用它们的事例。
用的最多的,最值得一丝不苟的,是整数范例。从只占一个字节存储空间的TINYINT到占8个字节的BIGINT,选择一个“够用”而且占用存储空间最小的范例是计划数据库时应当思索的。TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT占用存储空间分离为1字节、2字节、3字节、4字节和8字节,就无标记的整数而言,这些范例能暗示的最年夜整数分离为255、65535、16777215、4294967295和18446744073709551615。假如用来保留用户的岁数(举例来讲,数据库中保留岁数是不成取的),用TINYINT就够了;九城的《纵横》里,各项妙技值,用SMALLINT也够了;假如要用作一个一定不会凌驾16000000行的表的AUTO_INCREMENT的IDENTIFY字段,固然用MEDIUMINT不必INT,试想,每行勤俭一个字节,16000000行能够勤俭10兆多呢!

2、日期工夫范例。
日期和工夫范例对照复杂,不过是DATE、TIME、DATETIME、TIMESTAMP和YEAR等几个范例。只对日期敏感,而对工夫没有请求的字段,就用DATE而不必DATETIME是不必说的了;独自利用工夫的情形也时有产生――利用TIME;但最多用到的仍是用DATETIME。在日期工夫范例上没有甚么文章可做,这里就不再胪陈。

3、字符(串)范例。
不要觉得字符范例就是CHAR!CHAR和VARCHAR的区分在于CHAR是流动长度,只需你界说一个字段是CHAR(10),那末不管你存储的数据是不是到达了10个字节,它都要占往10个字节的空间;而VARVHAR则是可变长度的,假如一个字段大概的值是不流动长度的,我们只晓得它不成能凌驾10个字符,把它界说为VARCHAR(10)是最合算的,VARCHAR范例的实践长度是它的值的(实践长度+1)。为何“+1”呢?这一个字节用于保留实践利用了多年夜的长度呀!从这个“+1”中也应当看到,假如一个字段,它的大概值最长是10个字符,而多半情形下也就是用到了10个字符时,用VARCHAR就分歧算了:由于在多半情形下,实践占用空间是11个字节,比用CHAR(10)还多占用一个字节!
举个例子,就是一个存储股票称号和代码的表,股票称号尽年夜部分是四个字的,即8个字节;股票代码,上海的是六位数字,深圳的是四位数字。这些都是流动长度的,股票称号固然要用CHAR(8);股票代码固然是不流动长度,但假如利用VARVHAR(6),一个深圳的股票代码实践占用空间是5个字节,而一个上海的股票代码要占用7个字节!思索到上海的股票数量比深圳的多,那末用VARCHAR(6)就不如CHAR(6)合算了。
固然一个CHAR或VARVHAR的最年夜长度能够到255,我以为年夜于20的CHAR是几近用不到的――很少有年夜于20个字节长度的流动长度的东东吧?不是流动长度的就用VARCHAR!年夜于100的VARCHAR也是几近用不到的――比这更年夜的用TEXT就行了。TINYTEXT,最年夜长度为255,占用空间也是(实践长度+1);TEXT,最年夜长度65535,占用空间是(实践长度+2);MEDIUMTEXT,最年夜长度16777215,占用空间是(实践长度+3);LONGTEXT,最年夜长度4294967295,占用空间是(实践长度+4)。为何“+1”?“+2”?“+3”?“+4”?你如果还不晓得就该打PP了。这些能够用在论坛啊、旧事啊,甚么的,用来保留文章的注释。依据实践情形的分歧,选择从小到年夜的分歧范例。

4、列举和汇合范例。
列举(ENUM)范例,最多能够界说65535种分歧的字符串从中做出选择,只能而且必需选择个中一种,占用存储空间是一个或两个字节,由列举值的数量决意;汇合(SET)范例,最多能够有64个成员,能够选择个中的零个到不限制的多个,占用存储空间是一个到八个字节,由汇合大概的成员数量决意。
举个例子来讲,在SQLServer中,你能够勤俭到用一个Bit范例来暗示性别(男/女),但MySQL没有Bit,用TINTINT?不,能够用ENUM(帅哥,美眉)!只要两种选择,以是只需一个字节――跟TINYINT一样年夜,但却能够间接用字符串帅哥和美眉来存取。真是太便利啦!

好了,MySQL的数据范例先容得差未几,我的建库战略也跟着先容数据范例先容给人人一些。但这只是个中一部分,篇幅无限,不克不及再细说;其他的,就靠大家在对数据范例了解的基本上,多多理论、多多会商。一些典型的RDBMS功能并不总是在DBaaS系统中可用。例如MySQL学习教程,WindowsAzureSQLDatabase(以前的SQLAzure)是微软的DBaaS产品,提供了一个类似于SQLServer的数据库平台。

分手快乐 发表于 2015-1-18 18:20:21

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

变相怪杰 发表于 2015-1-27 16:13:14

还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。

冷月葬花魂 发表于 2015-2-5 14:18:18

你可以简单地认为适合的就是好,不适合就是不好。

谁可相欹 发表于 2015-2-12 05:20:44

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

只想知道 发表于 2015-3-2 23:42:41

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

不帅 发表于 2015-3-11 07:48:13

这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?

小魔女 发表于 2015-3-17 23:39:55

对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。

小妖女 发表于 2015-3-25 09:13:45

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。
页: [1]
查看完整版本: 发一篇MySQL的数据范例和建库战略