1.数据类型选择原则
越小越好,简单就好
2.五种整型(主要就是范围)
int bigint(互联网产品uid常用) smallint tinyint(名字常用) mediumint
大部分的需求都可以考虑int和bigint。
3.实数(精度标度的问题,数据取出时不一样)
float,double decimal
账户的信息:用decimal,内部以字符串形式存储,所以精度可以很高。
4.字符串
char/varchar binary/varbinary enum/set(枚举/集合)
char/varchar:有/无字符精度的概念。char:字符长度在定长的小范围内变化的时候比较好,否则系统效率低,空间浪费大。
windowDB中char/varchar差不多,优先考虑varchar即可。
静态表:整型+char。只要有一个字段是txt、varchar、blod,就是动态表。
binary/varbinary:无字符精度的概念,二进制存储,存进去是什么取出来就是什么。
enum/set:单项/多项选择。
性别:存的是0和1,但还需要一个map表,记录0表示男,1表示女。
枚举enum的话是将这两部分都包括。
角色问题,比如是否是管理员之类,都是枚举型。
5.时间和日期
year,date:较少用。一般很少有只存年的,一般是年月日时分秒都存一下,然后再在列上进行一些计算得到年。
datetime:1970-9999年,栈为8字节,有时区概念,缺省值:需要自己设置。
timestamp:1970-2038年,栈为4字节,无时区概念,缺省值:1.每次更新时自己更新为当前的时间。2.插入时设置为当前时间。
数据量很大的时候(百亿条),detetime和timestamp很占空间,这时换成整型数值进行存储。
考虑到软件用到2038年概率较小,2038年前mysql数据类型会不会有变化等,我们选用timestamp较为便捷。
6.IP(如:xx.xx.xx.xx)如何存
一般用char(15)较多,但当数据量非常大的时候,选用整型存储:2个函数inet——aton(),inet_ntoa()
7.关联查询注意的问题
1.由于类型不同而关联出错
2.varchar和enum列间关联查询的速度不同:enum和varchar关联时快。
8.索引设计观念
1.一个SQL有多种写法:比如有“小表驱动大表”的策略
2.索引不是越多越好:索引是为了提高查询速度,但是会降低写入(insert/update)速度。索引数应<=5。
3.优化该优化的语句:
比如优化查询频率高(核心业务)的语句,提高查询速度。
“最好的优化就是不做这个优化”,就是应该做设计的时候把数据库做好,以减少数据库的优化。
4.建立索引是一个取舍和均衡的过程:
索引是建立在真实的数据上的:有时候建立了一个索引,真正用的时候并用不到这个索引。
建议:先按照索引建立的优化原则先建立一个索引,线上再对它进行改进。会需要不断的优化与改进。
9.索引考虑过程
1.数据都有哪些类型的查询语句?
2.每种类型的查询语句在一个周期内占总查询量的比例是多少?:我们要优化查询量最大的那些语句。
3.是否分析过slow log?
4.哪些语句是产品的核心功能?
5.索引控制在5个以内
6.优化query(查询)范围:(其实SQL语句都包括,只是DML多一些)
不仅仅考虑select还要考虑update/insert/delete(要考虑提高写入速度和同步速度)(延迟一般是update/delete)
7.选择性好(这一列中数据重复性非常低的)的列放到前面
8.数据和索引(业务逻辑的索引)分开
9.避免在列上做运算
10.频繁更新的列不适合做索引