mysql使用笔记(四)
一、选择合适的数据类型
1. CHAR vs VCHAR
char是固定长度的字符类型,而varchar是可变长度的字符类型。char(M)的数据列中,每个值都占用M个字节,如果某个长度小于M,mysql就会在它的右边用空格字符补足,在检索操作的时候最后一个非空格字符右边的所有字符都会被去掉,因此需要注意,去掉右边的空格有可能不只去掉补足的空格,还有可能去掉原来字符串中右边已有的空格!
在varchar(M)的数据列中,每个值只占用刚好够用的字节数再加上一个用来记录其长度的字节(即总长度为L+1个字节)。
由于char固定长度,因此处理速度比vchar快,但是占用空间比vchar大,在使用的时候需要具体情况具体分析,一般的原则是:
(1)对于myisam表,尽量使用char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此;
(2)对于innodb表,尽量使用varchar。
2. TEXT vs BLOB
保存少量字符串时使用char或varchar,而保存较大的文本时,选择text或者blob。二者的区别是blob还可以保存二进制数据,比如图片;而text只能保存纯文本数据。text和blob又分别细分为text,mediumtext,longtext和blob,mediumblob,longblob三种不同的长度类型。
blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时。
删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上会有影响。为了提高性能,建议定期使用 optimize table功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。
可以使用合成的索引来提高大文本字段(blob或者text)的查询性能。合成索引就是根据大文本字段的内容建立一个散列值,并把这个值存储在单独的数据列中,接下来就可以根据检索散列值找到数据行。但是,这种技术只能用于精确匹配的查询(散列值对于类似<, >, >= 等范围搜索没有用)。
可以使用MD5(),SHA1(),CRC32()等来生成散列值。比如
create table t(id varchar(100), context blob, hash_value varchar(40));
insert into t values(1, repeate('beijing',2), md5(context)),
(2, repeate('beijing',200), md5(context)),
(100, repeate('helloworld',20), md5(context));
select * from t where hash_value=md5(repeat('beijing', 2));
如果需要对blob或text字段进行模糊匹配,mysql提供了前缀索引,即前缀%,比如select * from t where context='hello%'
。
3. 浮点数 vs 定点数
(1)浮点数存在表示误差,定点数采用字符串进行存储,精度高
(2)对货币等精度敏感的数据,应该采用定点数进行存储
(3)编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较
(4)要注意浮点数中一些特殊值的处理
4. 日期类型选择
(1)要根据实际需要选择能够满足应用的最小存储的日期类型。比如,如果仅需要记录年份,则用1个字节来存储的YEAR,而不用考虑4个字节的DATE
(2)如果要记录日期和时间,且记录的年份久远,最好使用DATETIME而不是TIMESTAMP,因为DATETIME的范围比TIMESTAMP广
(3)如果记录的日期需要让不同时区的用户使用,最好使用TIMESTAMP,因为TIMESTAMP和实际时区匹配
二、 mysql中的字符集
常用字符集比较:
字符集 | 是否定长 | 编码方式 | 其他说明 |
---|---|---|---|
ASCII | 是 | 单字节7位编码 | 最早的奠基性字符 |
IOS-8859-1/latin1 | 是 | 单字节8位编码 | 西欧字符集 |
GB2312 | 是 | 双字节编码 | 早期标准,不推荐使用 |
GBK | 是 | 双字节编码 | 不少系统支持 |
GB18030 | 否 | 2字节或4字节编码 | 开始有一些支持,但数据库不常见 |
UTF-32 | 是 | 四字节编码 | UCS-4原始编码,现在很少使用 |
UCS-2 | 是 | 2字节编码 | |
UTF-16 | 否 | 2字节或4字节编码 | java和windows xp/nt等内部使用 |
UTF-8 | 否 | 1~4字节编码 | 互联网和unix/linux广泛支持的unicode字符集 |
其中,GBK每个汉字占用2个字节,而UTF-8每个汉字占用3个字节。
mysql使用笔记(四)的更多相关文章
- MySql学习笔记四
MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...
- MySQL学习笔记四:字符集
1.字符集就是字符和其编码的集合,查看数据库支持的字符集 show character set 2.查看服务端启动时默认的字符集 mysql> show variables like 'char ...
- MySQL学习笔记(四)—存储过程
一.概述 存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...
- MySQL学习笔记(四):存储引擎的选择
一:几种常用存储引擎汇总表 二:如何选择 一句话:除非需要InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先考虑InnoDB:或者,不需要InnoDB的特性,并且其他的引擎更加合适当前情 ...
- mysql学习笔记四 —— AB复制
要点:ab复制 mysql集群架构流程: ABB(主从复制)-->MHA(实现mysql高可用.读写分离.脚本控制vip飘逸)-->haproxy(对slave集群实现分发,负载均衡)-- ...
- MySQL数据库笔记四:MySQL的约束
<1>概念 是一种限制,它是对表的行和列的数据做出约束,确保表中的数据的完整性和唯一性. <2>使用场景 创建表的时候,添加约束 <3>分类 1. default: ...
- MySql学习笔记(四) —— 数据的分组
前面介绍的聚集函数只是用来计算行数,平均数,最大值,最小值而不用检索所有数据.通过count()函数,我们可以计算生产商1003提供的产品数目,但如果我要查询所有生产商提供的商品数,这就需要进行分组查 ...
- openresty 学习笔记四:连接mysql和进行相关操作
openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...
- MYSQL基础笔记(四)-数据基本操作
数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...
- Mysql学习笔记(三)对表数据的增删改查。
正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...
随机推荐
- 制作变形、移位、扭曲等效果:《CSS3 transform》
今天开始我们一起来学习有关于CSS3制作动画的几个属性:变形(transform).转换(transition)和动画(animation)等更高级的CSS3技术.本文主要介绍的是这三个属性之中的第一 ...
- WITH (NOLOCK)
缺点: 1.会产生脏读 2.只适用与select查询语句 优点: 1.有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%. 2.可以用于inner join 语句 脏读: 一个用 ...
- vs自带iis局域网调试
http://www.cnblogs.com/liluping860122/p/4685564.html
- zImage.img、ramdisk.img、system.img、userdata.img介绍及解包、打包方法
ramdisk.img system.img userdata.img介绍及解包.打包方法 Android 源码编译后,在out/target/product/generic下生成ramdisk.im ...
- 关于C指针
地址概念:内存基本单元是一个字节,一个字节8个位.在定义变量的时候,如int a=10:系统为变量a分配2个字节空间:1000~1001,并在1001~1002中存有数据10.内存中没有变量a,只有1 ...
- 你不知道的This和Class
Oh no....我的This又丢失了??? 为什么我用Class'实例化'出来的对象会相互影响??? ####这些问题都是因为JS的运行机制造成的.在JS中所有的一切都是对象,而this是对象的一个 ...
- WinForm窗体及其控件的自适应
3步骤: 1.在需要自适应的Form中实例化全局变量 AutoSizeFormClass.cs源码在下方 AutoSizeFormClass asc = new AutoSizeFormClass ...
- 滤镜模糊效果,利用了文字阴影和透明。其实是抄的iSlider官网的
<!DOCTYPE html> <html> <meta charset="UTF-8"> <meta name="viewpo ...
- CodeForces 445B DZY Loves Chemistry
DZY Loves Chemistry Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- run a Freight robot (3)
5.Logging In Once the robot is turned on and the robot is on the network, ssh into the computer of t ...