数据库优化

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.频繁更新的列不适合做索引

你可能感兴趣的:(数据库优化)