在前面的学习中我们知道数据库其实就是很多表的一个集合,在创建表的时候,禁止使用中文做字段名,禁止使用字符型作为主键,禁止无主见或是唯一索引的出现,同时我们需要考虑为每一个字段设置合适的数据类型。
数据类型
整形
类型 | 大小 | 范围 |
---|---|---|
tinyint | 1字节 | (-128,127) |
smallint | 2字节 | (-32768,32767) |
mediumint | 3字节 | (-8388608,8388607) |
int | 4字节 | (-2字节,2字节) |
bigint | 8字节 | (-4字节,4字节) |
我们经常看到一些数据表中用int作为主键字段,其中最常用的是tinyint与int,同时我们在很多地方可以看到int(4)int(8)这种写法,这种其实是表示宽度,都是代表四个字节。
浮点型
浮点型分为单精度的float,双精度的double与小数值的decimal三种,可是在实际的生产中我们一般不建议用浮点型,因为它属于并不精确的类型,同时我们经常用decimal来表示存储的金钱字段。
时间类型
类型 | 大小(字节) | 格式 |
---|---|---|
date | 3 | YYYY-MM-DD |
time | 3 | HH-MM-SS |
year | 1 | YYYY |
datetime | 8/5 | YYYY-MM-DD HH-MM-SS |
timestamp | 4 | YYYYMMDDHHMMSS |
字符串类型
类型 | 大小(字节) | 用途 |
---|---|---|
char | 0-255 | 定常字符串 |
varchar | 0-255(65535) | 变长字符串 |
blob | 0-65535 | 短文本字符串 |
text | 0-65535 | 长文本数据 |
在面试中问的最多的就是char与varchar的差距,char类型用于定长字符串,大小固定,如果没有达到最大位数那么后面补充空格,varchar是变长字符串,长度范围0-65535,不会补充空格,并且超过指定长度会被截断。varchar可以动态改变存储的长度,可以节约磁盘空间,提高效率。
索引
索引是对数据库表中的一列或者多列的值进行排序的一种结构,就好比目录,通过目录可以快速的找到逍遥的内容。目前常用的索引结构有二叉树结构与哈希结构。
在二叉树结构中,常用的是B树与B-树,mysql用的是B-树的索引结构。
聚集索引与普通索引
MySQL数据库中的B-树索引分为两大类,分别为聚集索引与非聚集索引(普通索引),我们知道InnoDB存储引擎表是索引组织表,聚集索引其实就是一种索引组织形式,索引键值的逻辑顺序决定了表数据行的无理存储顺序,聚集索引叶子节点存放表中所有行数据信息,也就是我们所说的索引就是数据,普通索引在叶子节点并不包括行数据记录,只会在叶子节点存放自己本身的键值和主键的值,通过普通索引叶子节点上的逐渐来获取想要的行数据记录。
上图是我用explain搜索的一条信息,我们可以看到在type这里是ALL,代表全搜索,ref是索引,这里没有使用索引,所以是NULL,ROWS是所搜索的行数,由于全搜索所以肯定全部走一遍,效率很低
接下来我们添加索引来看看,在创建索引之前我们要考虑合理性
- 经常被查询的列
- 经常用于表连接的列
- 经常排序分组的列
接下来我们给id构建索引。
这里type变成了ref代表索引,key这里是使用的index_id这个索引进行查找。
主键索引和唯一索引
主键索引其实就是聚集索引,每张表中有且只有一个主键,可以由表中一个或多个字段组成,主键索引必须满足三个条件,主键必须唯一,不能包含null值,一定要保证是自增的
创建主键的语法
alter table table_name add primary key(column);
唯一索引是约束条件的一种,其实就是不能有重复的值,但是可以有null值,一个表只能有一个主键,可是可以有很多个唯一索引。
创建唯一索引的语法
alter table table_name add unique(colum);
哈希索引
哈希索引采用哈希算法,把键值换成哈希值,不能进行排序,模糊查找,范围查询等功能,但是相对B+树来说查询效率更高。