Mysql 数据库优化(一)——建库、建表【个人经验】

    可能很多同学觉得数据库很简单,建库、建表、增删改查。有很大的工作室在友好的客户端的可视环境下完成的。没错,大家可以用可视化简单、快速的完成这一些,但是如果面对过千万级数据的同学可能就会多一些数据化优化方面的思考(我正是这样)。

1、建库,建表。

大家可能都认为建库和建表是一个很简单的事,但是不同水平建出来的数据库的性能上回有很大的差异,接下来我说说我自己的理解。

Mysql的建库很简单,我利用的是Navicat可视界面建的数据库,这一步我也没发现啥好说的,但是建表这一步很是至关重要。

比如:我们建立一个全国的小学生表,字段包含id、name、sex、age、籍贯、datetime六个字段,在这5个字段中有数据类型数字、时间、字符。

如果采用的是下面的sql语句

CREATE TABLE `student` (
  `id` int NOT NULL,
  `name` varchar(255) NOT NULL,
  `sex` varchar(255) NOT NULL ,
  `age` int NOT NULL DEFAULT  0 ,
  `籍贯` varchar(255) NOT NULL ,
  `create_time` datetimeNOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ,
  PRIMARY KEY (`ids`)
)

好了一个学生的表就建好了,接下来我门想办法向该表中插入600万条学生的数据,然后运行下面的代码,查看下该表的大小:

/先进去MySQL自带管理库:information_schema   
//自己的数据库:MYDatabase  
//自己的表:student 
use information_schema; 
select data_length,index_length from
tables
where table_schema='MYDatabase' and table_name = 'student'; +-------------+--------------+ | data_length | index_length | +-------------+--------------+ | 166379520 | 235782144 | +-------------+--------------+ select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB, concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB from tables
    where table_schema='MYDatabase' and table_name = 'student'; +----------------+-----------------+ | data_length_MB | index_length_MB | +----------------+-----------------+ | 958.67MB | 0.00MB | +----------------+-----------------+

如果不出意外的话,你现在的student表的大小应该在1G左右,接着我们修该下student表的字段类型:

CREATE TABLE `student` (
  `id` mediumint NOT NULL,
  `name` varchar(20) NOT NULL,
  `sex` varchar(5) NOT NULL ,
  `age` tinyiunt NOT NULL DEFAULT  0 ,
  `籍贯` varchar(50) NOT NULL ,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ,
  PRIMARY KEY (`ids`)
)

可能时间比较长,因为你的数据量比较大,当更改完后我们在运行一下查看表大小的代码,看一下。不出意外的话你的表大小会减小100MB左右。

光是用对字段类型这一点就将数据表大小减小了这么多,维护表的性能自然也上升了不小。那么怎么确定字段最合适的数据类型呢?根据下面的表格自行选择:

合适的数据类型

Mysql 数据库优化(一)——建库、建表【个人经验】

时间存储格式总类并不是太多,我们常用的主要就是DATETIME,DATE和TIMESTAMP这三种了。从存储空间来看TIMESTAMP最少,四个字节,而其他两种数据类型都是八个字节,多了一倍。而TIMESTAMP的缺点在于他只能存储从1970年之后的时间,而另外两种时间类型可以存放最早从1001年开始的时间。如果有需要存放早于1970年之前的时间的需求,我们必须放弃TIMESTAMP类型,但是只要我们不需要使用1970年之前的时间,最好尽量使用TIMESTAMP来减少存储空间的占用。

Mysql 数据库优化(一)——建库、建表【个人经验】

CHAR[(M)]类型属于静态长度类型,存放长度完全以字符数来计算,所以最终的存储长度是基于字符集的,如latin1则最大存储长度为255字节,但是如果使用gbk则最大存储长度为510字节。CHAR类型的存储特点是不管我们实际存放多长数据,在数据库中都会存放M个字符,不够的通过空格补上,M默认为1。虽然CHAR会通过空格补齐存放的空间,但是在访问数据的时候,MySQL会忽略最后的所有空格,所以如果我们的实际数据中如果在最后确实需要空格,则不能使用CHAR类型来存放。

VARCHAR[(M)]属于动态存储长度类型,仅存占用实际存储数据的长度。TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT这四种类型同属于一种存储方式,都是动态存储长度类型,不同的仅仅是最大长度的限制。

1.float:浮点型(只显示7个有效位,对最后一位数四舍五入。)

2.double:双精度实型(只显示15个有效位,对最后一位四舍五入。)

3.decimal(numeric 同义):数字型,不存在精度损失,常用于银行帐目计算。(可以支持28位,对最后一位四舍五入。)

注:1、float和double的相乘操作,数字溢出不会报错,会有精度的损失。

     2、当对decimal类型进行操作时,数值会因溢出而报错。

decimal(M,D)用法:

·M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254),M 的默认值是10。

·D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过M。

说明:float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。

事例:如DECIMAL(5,2) 的最大值为9 9 9 9 . 9 9,因为有7 个字节可用。

根据上面的各种数据类型的解释相信大家可以建立相对性能较好的表结构了。