这两天有趣的事情很是多,好比,所谓的QQ一些内部培训资料流出,网上各大网盘啥的流量一会儿就很是高了。我固然也不当心就下载了一份,尚未看,不过好象什么百度的资料上已经有在线看了。由于本身也没有看,因此也不太清楚这玩意是真是假。mysql
OK,上正文,16日的MYSQL专场,对于mysql优化讲的较详细的应该算是杨涛涛,他对MYSQL的一些字段类型进行了些介绍,包括他们所含 的字节长度,来介绍给咱们让咱们了解如何对数据库进行优化,好比,尽可能不要用bigint,由于,这在项目中几乎不可能会被用上而他们占的字节长度倒是在int中最长的,在数据量大的时候,既占空间,又影响速度。程序员
还介绍了datetime和timstamp等的区别(更多能够看我之前写的连载,里面也有介绍)sql
不过,他惟独没有提起ENUM字段,提及这个ENUM,它却是mysql的一个特点字段,在之前不少人喜欢用它,由于他能够设置字段的区间范围,会让值能够被数据库所控制,不至于出现意料不到的值(好比,字段只想有0和1,结果出现了2,那2就是赃数据了)数据库
但ENUM带来的问题也很多,好比数据迁移的时候,他几乎不可能被其余数据库所支持,若是enum里面是字符串,对于其余数据库来讲就更郁闷了,还不能设为tinyint等类型的字段(enum虽然能够存储字符串,但对于内部来讲,仍是以顺序进行索引,好比'a','b','c',咱们也能够用索引值来获取值select * from tbl_name whre enum = 2,这与select * from tbl_name where enum = 'b'等义)若是你看明白了这两句SQL为何等义,那么你也就能够了解为何不主张用enum字段了。安全
由于,若是一个设计不合理的ENUM字段,给程序员带来的就彻底是梦魇了,好比一个enum字段的范围是('0','1','2','3','4','5'),我想这时候,你会不会哭呢?要知道enum的枚举值对应的索引是从1开始的,所以,insert into table (enum)values(1),你知道是插的什么值吗?你select from table一下,你就会发现,你插入的并非1,而是0。mysql优化
更有甚者,因为enum的区间也是能够变更的,若是你在enum的枚举字段范围中加一个值,而且不是加在最后,那么也就至关于,你把原来的范围都改变了索引值,试想这又是多么一个恐怖的事情?优化
所以,若是你的系统中真的已经使用了mysql的enum字段类型,请在查询的时候直接查询值(并加上单引号),这样就不会使用enum自身隐藏的索引值来获取结果了。【顺便说一下,enum的默认索引是从NULL开始,若是你容许NULL并default NULL】设计
之因此提起这个,是在用shopnc系统的时候发现大量这样的字段,让人很是郁闷,几乎没有办法优化(若是是纯数值型,仍是建议采用tinyint字段吧,毕竟它也只占一个字节,即便出现赃数据,也能够被接受,不象enum,若是纯数字型范围,更改了索引,你就不知道你查询的值是否正确了)索引
所以建议,若是字段是字符串,而且长度固定,能够尝试用char,若是是数值型,仍是用tinyint吧,比较安全稳定,并且即便迁移,问题也不大。字符串