MySQL在创建数据类型时应当遵守以下这三个简单原则:
1.更小更好
用能正确地存储和表示数据的最小类型来保存,它们使用了更少的磁盘空间,内存和CPU缓存,而且需要的CPU周期也少。
2.越简单越好
越简单的数据类型越好。例如比较整数的代价小于比较字符。用自带的日期类型来保存日期,而不要使用字符串或者整数来保存日期。保存IP地址也应该用整数。
3.尽量避免NULL
尽可能地把字段定义为NOT NULL,尽量考虑使用0,特殊值或者空字符串来替代。
类型 字节 范 围 无符号(unsigned)
tinyint 1 -128 127 0-255
smallint 2 -32768 32767 0-65535
mediumint 3 -8388608 8388607 0-16777215
int 4 -2147483648 2147483647 0-4294967295
bigint 8 -9223372036854775808 9223372036854775807 0-18446744073709551615
用尽可能小的类型来存储数据。
例子:
1.使用整数来存储IP地址
一个IPv4最小需要7个字符,最大需要15个字符,所以,使用VARCHAR(15)即可。但255.255.255.255转换为数字为4294967295,使用int(10)存储更节省空间,且int比varchar逻辑运算速度更快。mysql提供了函数inet_aton()、inet_ntoa()对数字和ip之间进行转换。
2.存储金额
从精度和稳定性考虑使用Decimal,部分行业要求使用Decimal,从性能上可以考虑使用int存分为单位的金额。除部分情况,不建议使用double和float
以上参考《高性能MySQL》
在架构上。今天刚学到一个公司中的数据隔离方式。
可以通过表隔离或者逻辑隔离的方式将不同公司间的数据进行隔离。
1.表隔离:每间小公司都有自己的客户数据表,所有小公司的客户数据表的结构都是一样的,但是只有自己对应的客户。
2.逻辑隔离:所有小公司都共用同一张数据表,不同小公司间的客户通过一个公司自己特殊的编号Org_ID来进行区分。即表中添加一个新的column”org_id“
例子:
假设有一家总司,旗下有很多小公司。
现在总公司要统计客户数据。如果公司用的是逻辑隔离,就可以直接查询。总公司可以很方便地通过一张表查到全部客户数据,但是数据一旦很多就会导致查询速度变慢。如果用的是表隔离,就相当于每间小公司都有一个自己的客户表,每家小公司可以很方便的只统计和管理自己的客户。但是当要统计所有公司加起来的客户时,就要每间公司都上报自己的客户数量最后再汇总,加长了流程,不方便全局统计。
因此是否使用orgid看公司需求。每个小公司自己建表会占用更多资源,但是方便管理。由总公司建表会方便公司统计但是不方便查询。各有好坏