一、字段类型选取:一般原则是保小不保大,能占用字节少的字段就不用大字段。比如主键强烈建议用int不要用uuid或guid,除了占用磁盘少,还会占用更少带宽。
1、手机号用什么类型?
相信很多公司会用varchar(11),其实从性能上考虑,应该设置为bigint,因为utf8占3个字节,那么11乘3就是33个字节,像bigint(20)的宽度为20,只占用8个字节。
2、IP地址用什么类型?
其实IP最好也用int整形,MySQL提供了一个很好用的函数:INET_ATON和INET_NTON它们负责把IP转为数字,或把数字转为IP,但是一定要注意数值溢出问题,一般用无符号int(11)。
3、年龄用什么类型?
用tinyint而不用int,道理很简单,无符号的tinyint(0-255),只占用一个字节,肯定能足够表示年龄,而int占4个字节。
4、用户状态用什么类型?
有人肯定会说用enum枚举,因为枚举也是占一个字节,其实最好还是用tinyint,因为枚举会存在拓展问题,如果需要另外加用户状态就要更改字段类型,虽然MySQL5.6新特性在线DDL,使更改避免了锁表,但动作还是很大。
5、时间类型用什么?
用timestamp而不用datetime,前者占4个字节,后者占8个字节。而且timestamp还具有自动更新时间功能,不需要你插入时间数据。如果你不想在每次插入时让系统自动更新为当前时间,你可以更改默认值为空。
二、InnoDB和MyISam存储引擎性能对比
MySQL5.5以前默认是MyISam,以后默认为InnoDB。InnoDB现在为大部分公司的首选存储引擎。InnoDB工作原理:把数据捞到内存中
,被用户读写,大大增加了性能,因为它是聚集索引,数据和索引存在一个文件;而MyISam是非聚集索引,索引和数据分开存,先通过索引找到指针再找到具体数据。我这里说一下为什么MyISam在MySQL5.5版本里Oracle公司支持的已经很少了,以后内存数据库是一种趋势的原因。因为MyISam存储引擎的读锁和写锁是互斥的,读写操作是串行的,试想一下,一个进程请求某个MyISam表的读锁,同时另一个进程也请求同一个表的写锁,MySQL肯定会把写锁插到读锁前面获取,因为MySQL中认为写一定比读重要,这就是MyISam不适合有大量更新操作和查询操作的原因,因为大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。所以如果应用中需要执行大量的读写操作,则应该使用InnoDB。
三、SQL优化与合理利用索引
1、如何定位执行很慢的SQL语句?
开启慢查询,在配置文件中增加long_query_time=2(超过2秒的SQL都会被记录下来)
2、or不会用到索引,应该避免在有索引的字段上使用or关键字
3、索引有开销,
每次写入,更新,删除时,如果该字段带有一个或多个索引,MySQL也要处理对应索引,增加了操作开销,还增加了数据库规模。只有当某一列被用于where子句时,才能享受到索引带来的性能提升。
4、单列索引和联合索引
都能提升查询效果,配合使用更佳,但是注意联合索引一定要遵循最左侧原则(第一个字段必须参与查询),否则联合索引必然失效。
5、但凡用到了函数,索引直接失效
6、不要为字段值为平均分布的数据集创建索引。像性别字段只有男女,这种情况下进行全表扫描比读取索引和数据更快。