mysql建表优化及列类型选择

建表优化

1. 定长与变长分离
所谓定长,就是字段的长度是固定大小,如int占四个字节,char(4)占四个字符,一些核心并且常用的字段,应该设置为定长。而变长如varchar,text等类型的字段长度不一,适合单放一张表,用主键与核心表关联起来。

为什么要这样做?如果一张表上的所有字段都是定长,那么当数据库想查任意某一行的数据,就能通过计算字节大小从而迅速找到。而变长字段则可以通过主键索引迅速找到其地址,从而查找数据。

2. 常用字段和不常用字段分离
需要结合网站具体的业务来分析,分析字段的查询场景,查询频度低的字段单拆出来。

3. 在一对多,需要关联统计的字段上。增加冗余字段
举个例子,文章类型表对应文章表,一对多。我们需要查看一种文章类型中有多少篇文章,可能都知道用count()这个函数,但是如果文章表没有经过优化,使用count()这个函数是及其费时的操作,如果文章的主键不是按顺序自增,那么mysql就会将所有的数据遍历一次进行计算,及其费时。

那么怎么优化?只需要在文章类型表中增加一个字段,存放该类文章的数量,每次对文章的删除修改同时对该字段进行操作,那么查询文章数量也就想当方便。这种反范式操作虽然消耗了极少的内存,但是大大的增加了查询效率。


列类型优化

1. 字段类型优先级 整型>date,time>enum,char>varchar>blob>text
总体而言,优先选择定长字段,在定长字段中优先选择整型。

举个例子,性别字段可以用tinyint和char(1),两者是定长。但是整型没有国家/地区之分,没有字符集的差异,而char则需要考虑字符集和校对集(也就是排序规则)

关于date/time的选择,大师的建议https://www.xaprb.com/blog/2014/01/30/timestamps-in-mysql/
直接选int unsigned not null,无符号整型不为空,用来存储时间戳

2.字段大小尽量够用,不要多出
这个应该都懂,节约内存,多表联查时,char(100)比char(10)要花更多内存

3.尽量避免用NULL
null不利于索引,更不利于查询


mysql学习过程的个人理解,仅供参考。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值