123084000鸟的信息用小数表示示是几万

自然数,负数,分数和小数的由来._百度作业帮
自然数,负数,分数和小数的由来.
人类是动物进化的产物,最初也完全没有数量的概念.但人类发达的大脑对客观世界的认识已经达到更加理性和抽象的地步.这样,在漫长的生活实践中,由于记事和分配生活用品等方面的需要,才逐渐产生了数的概念.比如捕获了一头野兽,就用1块石子代表.捕获了3头,就放3块石子."结绳记事"也是地球上许多相隔很近的古代人类共同做过的事.我国古书《易经》中有"结绳而治"的记载.传说古代波斯王打仗时也常用绳子打结来计算天数.用利器在树皮上或兽皮上刻痕,或用小棍摆在地上计数也都是古人常用的办法.这些办法用得多了,就逐渐形成数的概念和记数的符号. 数的概念最初不论在哪个地区都是1、2、3、4……这样的自然数开始的,但是记数的符号却大小相同. 古罗马的数字相当进步,现在许多老式挂钟上还常常使用. 实际上,罗马数字的符号一共只有7个:I(代表1)、V(代表5)、X(代表10)、L(代表50)、C代表100)、D(代表500)、M(代表1,000).这7个符号位置上不论怎样变化,它所代表的数字都是不变的.它们按照下列规律组合起来,就能表示任何数: 1.重复次数:一个罗马数字符号重复几次,就表示这个数的几倍.如:"III"表示"3";"XXX"表示"30". 2.右加左减:一个代表大数字的符号右边附一个代表小数字的符号,就表示大数字加小数字,如"VI"表示"6","DC"表示"600".一个代表大数字的符号左边附一个代表小数字的符号,就表示大数字减去小数字的数目,如"IV"表示"4","XL"表示"40","VD"表示"495". 3.上加横线:在罗马数字上加一横线,表示这个数字的一千倍.如:""表示 "15,000",""表示"165,000". 我国古代也很重视记数符号,最古老的甲骨文和钟鼎中都有记数的符号,不过难写难认,后人没有沿用.到春秋战国时期,生产迅速发展,适应这一需要,我们的祖先创造了一种十分重要的计算方法--筹算.筹算用的算筹是竹制的小棍,也有骨制的.按规定的横竖长短顺序摆好,就可用来记数和进行运算.随着筹算的普及,算筹的摆法也就成为记数的符号了.算筹摆法有横纵两式,都能表示同样的数字. 从算筹数码中没有"10"这个数可以清楚地看出,筹算从一开始就严格遵循十位进制.9位以上的数就要进一位.同一个数字放在百位上就是几百,放在万位上就是几万.这样的计算法在当时是很先进的.因为在世界的其他地方真正使用十进位制时已到了公元6世纪末.但筹算数码中开始没有"零",遇到"零"就空位.比如"6708",就可以表示为"┴ ╥ ".数字中没有"零",是很容易发生错误的.所以后来有人把铜钱摆在空位上,以免弄错,这或许与"零"的出现有关.不过多数人认为,"0"这一数学符号的发明应归功于公元6世纪的印度人.他们最早用黑点(·)表示零,后来逐渐变成了"0". 说起"0"的出现,应该指出,我国古代文字中,"零"字出现很早.不过那时它不表示"空无所有",而只表示"零碎"、"不多"的意思.如"零头"、"零星"、"零丁"."一百零五"的意思是:在一百之外,还有一个零头五.随着阿拉数字的引进."105"恰恰读作"一百零五","零"字与"0"恰好对应,"零"也就具有了"0"的含义. 如果你细心观察的话,会发现罗马数字中没有"0".其实在公元5世纪时,"0"已经传入罗马.但罗马教皇凶残而且守旧.他不允许任何使用"0".有一位罗马学者在笔记中记载了关于使用"0"的一些好处和说明,就被教皇召去,施行了拶(zǎn)刑,使他再也不能握笔写字. 但"0"的出现,谁也阻挡不住.现在,"0"已经成为含义最丰富的数字符号."0"可以表示没有,也可以表示有.如:气温0℃,并不是说没有气温;"0"是正负数之间唯一的中性数;任何数(0除外)的0次幂等于1;0!=1(零的阶乘等于1). 除了十进制以外,在数学萌芽的早期,还出现过五进制、二进制、三进制、七进制、八进制、十进制、十六进制、二十进制、六十进制等多种数字进制法.在长期实际生活的应用中,十进制最终占了上风. 现在世界通用的数码1、2、3、4、5、6、7、8、9、0,人们称之为阿拉伯数字.实际上它们是古代印度人最早使用的.后来阿拉伯人把古希腊的数学融进了自己的数学中去,又把这一简便易写的十进制位值记数法传遍了欧洲,逐渐演变成今天的阿拉伯数字. 数的概念、数码的写法和十进制的形成都是人类长期实践活动的结果. 随着生产、生活的需要,人们发现,仅仅能表示自然数是远远不行的.如果分配猎获物时,5个人分4件东西,每个人人该得多少呢?于是分数就产生了.中国对分数的研究比欧洲早1400多年!自然数、分数和零,通称为算术数.自然数也称为正整数. 随着社会的发展,人们又发现很多数量具有相反的意义,比如增加和减少、前进和后退、上升和下降、向东和向西.为了表示这样的量,又产生了负数.正整数、负整数和零,统称为整数.如果再加上正分数和负分数,就统称为有理数.有了这些数字表示法,人们计算起来感到方便多了. 但是,在数字的发展过程中,一件不愉快的事发生了.让我们回到大经贸部2500年前的希腊,那里有一个毕达哥拉斯学派,是一个研究数学、科学和哲学的团体.他们认为"数"是万物的本源,支配整个自然界和人类社会.因此世间一切事物都可归结为数或数的比例,这是世界所以美好和谐的源泉.他们所说的数是指整数.分数的出现,使"数"不那样完整了.但分数都可以写成两个整数之比,所以他们的信仰没有动摇.但是学派中一个叫希帕索斯的学生在研究1与2的比例中项时,发现没有一个能用整数比例写成的数可以表示它.如果设这个数为X,既然,推导的结果即x2=2.他画了一个边长为1的正方形,设对角线为x ,根据勾股定理x2=12+12=2,可见边长为1的正方形的对角线的长度即是所要找的那个数,这个数肯定是存在的.可它是多少?又该怎样表示它呢?希帕索斯等人百思不得其解,最后认定这是一个从未见过的新数.这个新数的出现使毕达哥拉斯学派感到震惊,动摇了他们哲学思想的核心.为了保持支撑世界的数学大厦不要坍塌,他们规定对新数的发现要严守秘密.而希帕索斯还是忍不住将这个秘密泄露了出去.据说他后来被扔进大海喂了鲨鱼.然而真理是藏不住的.人们后来又发现了很多不能用两整数之比写出来的数,如圆周率 就是最重要的一个.人们把它们写成 π、等形式,称它们为无理数. 有理数和无理数一起统称为实数.在实数范围内对各种数的研究使数学理论达到了相当高深和丰富的程度.这时人类的历史已进入19世纪.许多人认为数学成就已经登峰造极,数字的形式也不会有什么新的发现了.但在解方程的时候常常需要开平方如果被开方数负数,这道题还有解吗?如果没有解,那数学运算就像走在死胡同中那样处处碰壁.于是数学家们就规定用符号"i "表示"-1"的平方根,即i=,虚数就这样诞生了."i "成了虚数的单位.后人将实数和虚数结合起来,写成 a+bi的形式(a、b均为实数),这就是复数.在很长一段时间里,人们在实际生活中找不到用虚数和复数表示的量,所以虚数总让人感到虚无缥缈.随着科学的发展,虚数现在在水力学、地图学和航空学上已经有了广泛的应用,在掌握和会使用虚数的科学家眼中,虚数一点也不"虚"了. 数的概念发展到虚和复数以后,在很长一段时间内,连某些数学家也认为数的概念已经十分完善了,数学家族的成员已经都到齐了.可是日,英国数学家哈密尔顿又提出了"四元数"的概念.所谓四元数,就是一种形如的数.它是由一个标量 (实数)和一个向量(其中x 、y 、z 为实数)组成的.四元数的数论、群论、量子理论以及相对论等方面有广泛的应用.与此同时,人们还开展了对"多元数"理论的研究.多元数已超出了复数的范畴,人们称其为超复数. 由于科学技术发展的需要,向量、张量、矩阵、群、环、域等概念不断产生,把数学研究推向新的高峰.这些概念也都应列入数字计算的范畴,但若归入超复数中不太合适,所以,人们将复数和超复数称为狭义数,把向量、张量、矩阿等概念称为广义数.尽管人们对数的归类法还有某些分歧,但在承认数的概念还会不断发展这一点上意见是一致的.到目前为止,数的家庭已发展得十分庞大. 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
计算机络与Internet基础
下载积分:1000
内容提示:
文档格式:PPT|
浏览次数:0|
上传日期: 15:15:36|
文档星级:
该用户还上传了这些文档
计算机络与Internet基础.PPT
官方公共微信如何写出小数知识的三个有关内容(三年级下册)_百度作业帮
如何写出小数知识的三个有关内容(三年级下册)
人类是动物进化的产物,最初也完全没有数量的概念.但人类发达的大脑对客观世界的认识已经达到更加理性和抽象的地步.这样,在漫长的生活实践中,由于记事和分配生活用品等方面的需要,才逐渐产生了数的概念.比如捕获了一头野兽,就用1块石子代表.捕获了3头,就放3块石子."结绳记事"也是地球上许多相隔很近的古代人类共同做过的事.我国古书《易经》中有"结绳而治"的记载.传说古代波斯王打仗时也常用绳子打结来计算天数.用利器在树皮上或兽皮上刻痕,或用小棍摆在地上计数也都是古人常用的办法.这些办法用得多了,就逐渐形成数的概念和记数的符号.
数的概念最初不论在哪个地区都是1、2、3、4……这样的自然数开始的,但是记数的符号却大小相同.
古罗马的数字相当进步,现在许多老式挂钟上还常常使用.
实际上,罗马数字的符号一共只有7个:I(代表1)、V(代表5)、X(代表10)、L(代表50)、C代表100)、D(代表500)、M(代表1,000).这7个符号位置上不论怎样变化,它所代表的数字都是不变的.它们按照下列规律组合起来,就能表示任何数:
1.重复次数:一个罗马数字符号重复几次,就表示这个数的几倍.如:"III"表示"3";"XXX"表示"30".
2.右加左减:一个代表大数字的符号右边附一个代表小数字的符号,就表示大数字加小数字,如"VI"表示"6","DC"表示"600".一个代表大数字的符号左边附一个代表小数字的符号,就表示大数字减去小数字的数目,如"IV"表示"4","XL"表示"40","VD"表示"495".
3.上加横线:在罗马数字上加一横线,表示这个数字的一千倍.如:""表示 "15,000",""表示"165,000".
我国古代也很重视记数符号,最古老的甲骨文和钟鼎中都有记数的符号,不过难写难认,后人没有沿用.到春秋战国时期,生产迅速发展,适应这一需要,我们的祖先创造了一种十分重要的计算方法--筹算.筹算用的算筹是竹制的小棍,也有骨制的.按规定的横竖长短顺序摆好,就可用来记数和进行运算.随着筹算的普及,算筹的摆法也就成为记数的符号了.算筹摆法有横纵两式,都能表示同样的数字.
从算筹数码中没有"10"这个数可以清楚地看出,筹算从一开始就严格遵循十位进制.9位以上的数就要进一位.同一个数字放在百位上就是几百,放在万位上就是几万.这样的计算法在当时是很先进的.因为在世界的其他地方真正使用十进位制时已到了公元6世纪末.但筹算数码中开始没有"零",遇到"零"就空位.比如"6708",就可以表示为"┴ ╥ ".数字中没有"零",是很容易发生错误的.所以后来有人把铜钱摆在空位上,以免弄错,这或许与"零"的出现有关.不过多数人认为,"0"这一数学符号的发明应归功于公元6世纪的印度人.他们最早用黑点(·)表示零,后来逐渐变成了"0".
说起"0"的出现,应该指出,我国古代文字中,"零"字出现很早.不过那时它不表示"空无所有",而只表示"零碎"、"不多"的意思.如"零头"、"零星"、"零丁"."一百零五"的意思是:在一百之外,还有一个零头五.随着阿拉数字的引进."105"恰恰读作"一百零五","零"字与"0"恰好对应,"零"也就具有了"0"的含义.
如果你细心观察的话,会发现罗马数字中没有"0".其实在公元5世纪时,"0"已经传入罗马.但罗马教皇凶残而且守旧.他不允许任何使用"0".有一位罗马学者在笔记中记载了关于使用"0"的一些好处和说明,就被教皇召去,施行了拶(zǎn)刑,使他再也不能握笔写字.
但"0"的出现,谁也阻挡不住.现在,"0"已经成为含义最丰富的数字符号."0"可以表示没有,也可以表示有.如:气温0℃,并不是说没有气温;"0"是正负数之间唯一的中性数;任何数(0除外)的0次幂等于1;0!=1(零的阶乘等于1).
除了十进制以外,在数学萌芽的早期,还出现过五进制、二进制、三进制、七进制、八进制、十进制、十六进制、二十进制、六十进制等多种数字进制法.在长期实际生活的应用中,十进制最终占了上风.
现在世界通用的数码1、2、3、4、5、6、7、8、9、0,人们称之为阿拉伯数字.实际上它们是古代印度人最早使用的.后来阿拉伯人把古希腊的数学融进了自己的数学中去,又把这一简便易写的十进制位值记数法传遍了欧洲,逐渐演变成今天的阿拉伯数字.
数的概念、数码的写法和十进制的形成都是人类长期实践活动的结果.
随着生产、生活的需要,人们发现,仅仅能表示自然数是远远不行的.如果分配猎获物时,5个人分4件东西,每个人人该得多少呢?于是分数就产生了.中国对分数的研究比欧洲早1400多年!自然数、分数和零,通称为算术数.自然数也称为正整数.
随着社会的发展,人们又发现很多数量具有相反的意义,比如增加和减少、前进和后退、上升和下降、向东和向西.为了表示这样的量,又产生了负数.正整数、负整数和零,统称为整数.如果再加上正分数和负分数,就统称为有理数.有了这些数字表示法,人们计算起来感到方便多了.
但是,在数字的发展过程中,一件不愉快的事发生了.让我们回到大经贸部2500年前的希腊,那里有一个毕达哥拉斯学派,是一个研究数学、科学和哲学的团体.他们认为"数"是万物的本源,支配整个自然界和人类社会.因此世间一切事物都可归结为数或数的比例,这是世界所以美好和谐的源泉.他们所说的数是指整数.分数的出现,使"数"不那样完整了.但分数都可以写成两个整数之比,所以他们的信仰没有动摇.但是学派中一个叫希帕索斯的学生在研究1与2的比例中项时,发现没有一个能用整数比例写成的数可以表示它.如果设这个数为X,既然,推导的结果即x2=2.他画了一个边长为1的正方形,设对角线为x ,根据勾股定理x2=12+12=2,可见边长为1的正方形的对角线的长度即是所要找的那个数,这个数肯定是存在的.可它是多少?又该怎样表示它呢?希帕索斯等人百思不得其解,最后认定这是一个从未见过的新数.这个新数的出现使毕达哥拉斯学派感到震惊,动摇了他们哲学思想的核心.为了保持支撑世界的数学大厦不要坍塌,他们规定对新数的发现要严守秘密.而希帕索斯还是忍不住将这个秘密泄露了出去.据说他后来被扔进大海喂了鲨鱼.然而真理是藏不住的.人们后来又发现了很多不能用两整数之比写出来的数,如圆周率 就是最重要的一个.人们把它们写成 π、等形式,称它们为无理数.
有理数和无理数一起统称为实数.在实数范围内对各种数的研究使数学理论达到了相当高深和丰富的程度.这时人类的历史已进入19世纪.许多人认为数学成就已经登峰造极,数字的形式也不会有什么新的发现了.但在解方程的时候常常需要开平方如果被开方数负数,这道题还有解吗?如果没有解,那数学运算就像走在死胡同中那样处处碰壁.于是数学家们就规定用符号"i "表示"-1"的平方根,即i=,虚数就这样诞生了."i "成了虚数的单位.后人将实数和虚数结合起来,写成 a+bi的形式(a、b均为实数),这就是复数.在很长一段时间里,人们在实际生活中找不到用虚数和复数表示的量,所以虚数总让人感到虚无缥缈.随着科学的发展,虚数现在在水力学、地图学和航空学上已经有了广泛的应用,在掌握和会使用虚数的科学家眼中,虚数一点也不"虚"了.
数的概念发展到虚和复数以后,在很长一段时间内,连某些数学家也认为数的概念已经十分完善了,数学家族的成员已经都到齐了.可是日,英国数学家哈密尔顿又提出了"四元数"的概念.所谓四元数,就是一种形如的数.它是由一个标量 (实数)和一个向量(其中x 、y 、z 为实数)组成的.四元数的数论、群论、量子理论以及相对论等方面有广泛的应用.与此同时,人们还开展了对"多元数"理论的研究.多元数已超出了复数的范畴,人们称其为超复数.
由于科学技术发展的需要,向量、张量、矩阵、群、环、域等概念不断产生,把数学研究推向新的高峰.这些概念也都应列入数字计算的范畴,但若归入超复数中不太合适,所以,人们将复数和超复数称为狭义数,把向量、张量、矩阿等概念称为广义数.尽管人们对数的归类法还有某些分歧,但在承认数的概念还会不断发展这一点上意见是一致的.到目前为止,数的家庭已发展得十分庞大. 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
基于三端稳压器的电源电路论文
下载积分:1000
内容提示:
文档格式:DOC|
浏览次数:0|
上传日期: 21:41:40|
文档星级:
该用户还上传了这些文档
基于三端稳压器的电源电路论文.DOC
官方公共微信高性能MySql设计之数据类型的优化
阅读:359次&&&时间: 09:55:54&&
在数据库性能提升关键技术中,对字段的优化难度相对较低且对性能的影响也非常的大。由于Mysql支持的数据类型比较多,且每个类型都有其独特的特性,但是有时候在选择一个具体的数据类型时,往往都是随意的选择一个能用的类型,而不会考虑到这个类型是否是最优的。在具体的类型描述之前,先来看一些针对数据类型选择的主要原则:
a)&&&&& 尽量选择占用空间小的类型
因为小的类型无论是在磁盘,还是在内存中占用的空间都是小的,在进行查询或者排序是临时表要求的空间也会相对较少。在数据量比较小的时候可能感觉不到,但是当数据量比较大时,这个原则的重要性可能就会得到显现。
例如,有一张&商品信息&表,记录为2000万条,这张表有个 &剩余商品数量&(COUNT)的字段,一般而言 SMALLINT (len:16& range:0-65535)已经足够表达这个字段,可是如果你在设计的过程中用了BIGINT(len:64 range:0-)来表达,虽然说程序可能正确的运行,但是这一个字段将会额外的增加大概95M的磁盘存储空间(64-16)/8*20,000,000 Bytes),另外在做数据选择和排序时仅仅这一个字段就会增加你95M的内存消耗,基于以上行为的影响,数据库的Performance必然是会被影响的
这里说的尽量小的前提是确保你将要选择的类型可以满足日后业务发展的需求,因为在数据量比较大的时候做表结构的更新是个非常缓慢而且麻烦的事情。
b)&&& 尽量选择简单/恰当的类型
在对表进行选择以及排序的时候,对于简单的类型往往只需要消耗较少的CPU时钟周期。例如,对于MySql server而言,整数类型值的Compare往往会比字符串类型值的Compare简单且快,所以当你需要对特定的表进行排序时应该尽量选择整数类型作为排序的依据
c)&&&&&& 尽量将字段设置为NOTNULL
一般情况下,如果你没有显示的制定一个字段为NULL,那么这个字段将会被数据库系统认为是NULLABLE, 系统的这种默认行为将会导致以下三个问题
(1) Mysql服务器自身的 查询优化功能将会受影响
(2) Mysql针对null值的字段需要额外的存储空间以及处理
(3) 如果一个null值是索引的一部分,那么索引的效果也会收到影响
&由于这个原则对于数据库性能提升的作用不是很大,所以对于已经存在的DB schema,其存在NULLABLE字段或者是索引为NULLABLE的,也不用专门的去修改它,但是对于新设计的DB或者索引需要尽量遵守这个原则。
介绍完了数据类型选择的原则后,接下来将会介绍Mysql中常见的数据类型以及在性能优化方面需要注意的地方。
&&&&&&&&&整数
在Mysql 的整数家族成员中主要包括TINYINT(8bit), SMALLINT(16bit),& MEDIUMINT(24bit), INT(32bit), or BIGINT(64bit)。
对于有符号整数而言这些类型的存储范围为(-2(n-1) ,2(n-1)-1),对于无符号数而言表达的范围是(0,2n-1),对于数据库而言有符号数和无符号数占用相同的存储空间,所以在选择类型的时候可以只考虑数的区间,而不用考虑是signed还是unsigned
&Mysql允许你在定义整数类型时指定他的宽度,例如 INT(10)。INT(10) 对于Client/CMD Line的输出是有区别的,但在Mysql Server看来实际的存储空间/计算消耗/数字范围 INT(10)与INT(32)没有任何的区别。
&&&&&&&&&小数
在Mysql中小数家族的数据类型主要包括FLOAT(4Bytes),DOUBLE(8Bytes),从这两种类型的存储空间可以看出小数的存取比整数需要消耗更多的空间,所以除非必须,否则应该尽量避免使用小数的类型
创建小数类型的字段时,你可以使用FLOAT(10,3)的方式来指定小数的精度,&=Mysql 5.0的版本中最大的精度支持到小数点后65位。
由于数据库采用Binary Array String的方式来存储小数点后面的数字,所以你要求的精度越高,存储空间/计算的CPU时钟可能消耗的也就越高。
&虽然使用小数可能会消耗更多的存储空间以及CPU资源,而且对于早期的Mysql版本还会出现当两个小数参与计算时精度丢失的情况,但是在很多情况下它又是必须的,例如在金融领域中关于金额的存储。在很多情况下为了减少存储的开销以及保证精度的准确性,往往会把小数扩大至整数存储在数据库中,而在Application中再进行小数的转换以及计算,例如 某个用户的账户余额还剩下999.35元,那么在数据中存储的金额为99935分,银行的处理程序拿到99935分后会先转换成999.35元,然后再进行相应的处理
&&&&&&& 字符串
不管对于哪门语言而言,字符串都是一个比较重要且复杂的类型,这个规律对于MYSQL同样适用
在MYSQL中主要包括VARCHAR以及CHAR两种字符串类型,对于这两种字符串类型在磁盘以及内存中存储方式是由Storage engine决定的,且不同的storage engine可能会有不同的存储方式。一般情况下对于一种storage engine 而言,在磁盘以及内存中的存储方式也是不同的,当数据在磁盘与内存之间转移时,storage engine将会负责把数据进行转换
首先需要指出的是Mysql是用variable& length的方式来来存储VARCHAR,相对于fixed length,这种方式对存储空间采取的策略是&用多少,要多少&,是一种比较节省空间的存储方案,在没有特殊需求的情况下可以作为默认的类型
VARCHAR之所以可以实现定长,是因为每个VARCHAR值都会附加一个 长度为1-2byte 的长度指示器,例如当需要存储&I Love Java&时,底层的存储内容为 &11I Love Java&,其中11(1 Byte)代表长度。当需要存储内容的长度为1000时长度指示器就需要两个字节。因为2bytes的最大值为216,所以当存储的字符串超过这个长度时,会出现不可预料的异常,这时就需要使用CLOB来存储这种超长的字符串。
在MYSQL的不同版本中,针对VARCHAR字段的结尾空格处理也有所不同
Version&=5.0 保留结尾的空格
Version&=4.1& 截取空格
以MYSQL& 5.6 为例:
?&&&&&&&使用VARCHAR(5) 和VARCHAR(200) 存储&hello&的空间开销是一样的。那么使用更短的列有什么优势吗?
事实证明有很大的优势。更大的列会消耗更多的内存,因为MySQL 通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。
所以最好的策略是只分配真正需要的空间。
CHAR类型与VARCHAR类型最大的区别在于它是定长的。同时相比于VARCHAR它主要有以下特点
&1)在所有的MYSQL版本中,末尾的空格都会被截取
2)对于 一些短的且是长度基本相同的字段是个不错的选择例如MD5,ID Number
3)对于经常需要变更的字段,CHAR类型会更高效
4)对于一些超短的字段,也非常的节约空间。例如你保存&Y&或者是&N&,用CHAR只需要一个字节,而用VARCHAR 的话需要两个字节(1byte length+1 byte value)
对于定长的CHAR,Mysql server会根据其定义的长度采用补空格的方式来分配足够大的存储空间。有一点需要注意的是 VARCHAR/CHAR在进行&补空格&以及&去结尾空格&的操作是由Mysql server来实现的,与Storage engine 无关
在实际的应用程序中往往需要存储两种体积较大的数据,一种是较大的Binary数据,e.g. 一张10M的图片,另外一种是 较大的文本 e.g.一篇几万字的文章。在Oracle中有BOLB和CLOB来应对这两种数据,而在MySQL中对应的是BLOB以及TEXT.
鉴于这两种数据类型的特殊性,在MySQL中对BLOB以及TEXT的存储和操作做了特殊的处理:
&&&&&&&&& 1) BLOB/TEXT 的值往往是作为对象来处理,这些对象有自己的ID,以及独立的存储空间
&&&&&&&&& 2) BLOB/TEXT的值被用来排序的时候,只有前N个字节会被使用,N 对应的是数据库中的一个常量值 (max_sort_length), 如果你想指定更多的字节被用来排序,那么你可以增加max_sort_length的值或者是使用ORDER BY SUBSTRING(column, length)函数来处理
&&&&&&&&& 3) 当BLOB/TEXT 被用作索引或者排序的时候,不能使用整个字段的值.
在万不得已的情况下要避免把BOLB/TEXT用作索引或是排序
因为MySQL 的Memory 引擎不支持BLOB 和TEXT 类型,所以,如果查询的过程中涉及到BLOB /TEXT,则需要使用MyISAM 磁盘临时表,即使只有几行数据也是如此(在最新的Percona Server 的Memory 引擎支持BLOB 和TEXT 类型)。
Memory引擎频繁的访问磁盘临时表会产生严重的性能开销,最好的解决方案是尽量避免使用BLOB 和TEXT 类型。如果实在无法避免,有一个技巧是在所有用到BLOB 字段的地方都使用SUBSTRING(column, length) 将列值转换为字符串(在ORDER BY 子句中也适用),这样就可以使用内存临时表了。但是要确保截取的子字符串足够短,不会使临时表的大小超过max_heap_table_size 或tmp_table_size,超过以后MySQL 会将内存临时表转换为MyISAM 磁盘临时表。
最坏情况下的长度分配对于排序的时候也是一样的,所以这一招对于内存中创建大临时表和文件排序,以及在磁盘上创建大临时表和文件排序这两种情况都很有帮助。例如,假设有一个1 000 万行的表,占用几个GB 的磁盘空间。其中有一个utf8字符集的VARCHAR(1000) 列。每个字符最多使用3 个字节,最坏情况下需要3 000字节的空间。如果在ORDER BY 中用到这个列,并且查询扫描整个表,为了排序就需要超过30GB 的临时表
DATETIME/TIMESTAMP
在MySQL中包含两种时间格式 DATETIME,TIMESTAMP, 通常在使用的过程中这两种类型区别不是很大,但是在细节上还是存在差别
可表示区间(年)
是否与时区有关
日期和时间封装到格式为YYYYMMDDHHMMSS 的整数中
保存了从1970 年1 月1 日午夜(格林尼治标准时间)以来的秒数,它和UNIX 时间戳相同
显示方式是否与时区有关
否(ANSI 标准定义的日期和时间表示方法)
(1)TIMESTAMP 列默认为NOT NULL,默认值为当前时间
因为TMESSTAMP会占用更小的存储空间,所以可以使用它作为默认的时间格式
这种类型的字段主要是通过枚举的方式来保存列的值,因为在使用的过程中会涉及到枚举位置与实际值的转换,所以对于整体的性能可能会有一定的影响,而且枚举的值是存储在.frm(数据表结构定义文件)中,所以当建立完ENUM的列后,如果你想对EMUM的内容进行更新,也就相当于做了表结构的更新。
下面是个简单建立ENUM列的例子:
mysql& CREATE TABLEenum_test(
-&& e ENUM('fish', 'apple', 'dog') NOT NULL
mysql& INSERT INTOenum_test(e) VALUES('fish'), ('dog'), ('apple');
如果需要让你设计一个表示布尔值的字段要求占用的空间最少,你会如何去设计?用INT,还是用CHAR(1)?相比INT以及CHAR(1)而言BIT(1)或许是个更好的选择,因为它占用的空间只是一个BIT。它可以通过BIT(N)的方式来表达多个BIT的值,这种方式最大支持到BIT(64)。
在MySQL5.0之前的版本中,BIT被认为是和TINYINT等同的,在新的版本中被作为两种完全不同的类型来对待。
当你把一个BIT字段从数据库中检索出来显示在控制台上时,值会被显示成ASCII编码,当字段的值出在一个数字运算的上下文时,它会被当成是BIT的十进制的值,下面的一个例子可以很清楚的说明这两种情况
mysql&CREATE TABLE bittest(a bit(8));
mysql& INSERT INTObittest VALUES(b'');
mysql& SELECT a, a+ 0 FROM
+------+-------+
| a | a + 0 |
+------+-------+
| 9 | 57 |
+------+-------+
上面的这个例子或许会让你感到困惑,很有可能让你不再想使用这种机制来存储单个的位,作为一种替代方案可以把相关字段设置成CHAR(0),NULL用来表示False,&&(Empty String)表示True
在设计数据库表结构的时候,通常情况下每张表结构都有一个字段作为ID,因为 ID会被用来做查询,JOIN,FK等操作,所以ID设计的好坏对性能的影响很大。
&-------------------------------
在为ID选择合适的类型的时候不仅需要考虑这种类型在数据库中存储所占用的空间,还需要考虑该类型在计算或者是值比较时的特性,例如BIT类型存储的时候是二进制的形式,而在数字计算的上下文时,会被转换成对应的十进制形式。
对ID进行JOIN操作或者是被用来作为其他表的FK时,涉及的字段类型要保持完全的一致,即使类型都是整数,Unsigned/Signed这样的微小细节也要保持一致,否则在性能方面可能会有意想不到的性能问题,这种问题往往又是难以被发现的。如果使用的Storage Engine 是InnoDB,则可以有效的防止关联字段类型不匹配的问题,如果类型不匹配则会抛出 异常&ERROR 1005 (HY000): Can&t createtable&(VARCHAR(10)和VARCHAR(20)会被认为类型是完全相同的)。
创建ID时,要遵守&尽量最小类型原则&(在满足以后需求变化的情况下,要选择占用存储空间最小的类型),例如 有一张存储全国省份的表,对于这张种需求而言,TINYINT比INT更适合作为ID的类型,虽然选用TINYINT只是节省了3个BYTE, 但是在进行JOIN操作或者是作为FK时,性能可能会有很大的提升。
实际的应用开发中,ID的类型往往是多样的,例如INT,VARCHAR是比较常用的两种类型,但是有些情况下也可以使用ENUM作为ID的类型,下面的内容分别对这几种类型进行描述
因为整数类型是一种简单的类型,对比于字符串它的处理更简单速度更快,而且它还支持AUTO_INCREMENT特性,所以一般情况下它是作为ID的首选类型
因为MySQL处理字符串要比整数消耗更多的存储/内存空间,而且速度也相对较慢,所以应该尽量避免使用字符串作为ID的类型。
在无法避免字符串作为ID的类型时,往往会采用&随机值&的策略来生成ID的值,常用的方法包括UUID,MD5, SHA1.在这种情况下需要额外注意,因为随机生成的ID值可能会带来以下三个问题:
&&&&&&&& (1)&&& 在执行INSERT语句时意味着索引值会被任意写到索引表的不同位置,这种对于磁盘的随机访问行为,将会导致插入操作的变慢,
&&&&&&&& (2)&&& 在执行SELECT操作时,因为逻辑相关的索引也被会被任意写到索引表的不同位置,也会导致查询的变慢。
&&&&&&&& (3)&&& 对于数据库提供的CACHE机制而言,这种随机值的策略产生的影响也是比较大的。因为CACHE往往是基于&热区&的原理来实现的,比如说索引表中有100个索引,你执行了多次的查询的结果都是索引表中的20-30这部分的索引,那么 MySQL& Serve为了提高查询效率会把20-30这部分索引的值放到CACHE中,如果你又有一些查询的结果是在30-40 之间的,那么Server会对CACHE进行更新。如果是基于随机的索引,意味着&热区&的区间将会很大,这将导致CACHE的命中率受到影响,而且也会导致CACHE的不断刷新。
如果存储UUID 值,则应该移除&-&符号;或者更好的做法是,用UNHEX() 函数转换UUID 值为16 字节的数字,并且存储在一个BINARY(16) 列中。检索时可以通过HEX()函数来格式化为十六进制格式。
对于ID来说,EMUM 和SET 类型通常是一个糟糕的选择,尽管对某些只包含固定状态或者类型的静态&定义表&来说可能是没有问题的。ENUM 和SET 列适合存储固定信息,例如有序的状态、产品类型、人的性别。没有特殊需求,应该放弃这个选择
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
Copyright &
All Rights Reserved

我要回帖

更多关于 小数二进制表示 的文章

 

随机推荐