话不多说,直接上干货 !!!
数据库设计:
1.字段原子性(表字段,不可再分)
2.消除对主键的部分依赖
除了id之外,需要另外一个类似与编号的字段,处理业务可以直接使用编号进行处理
3.添加外键
数据类型:
1.尽量使用可以正确存储数据的最小数据类型
更小的数据类型意味着更快,占用更少的磁盘,内存、缓存和处理时间
2.尽量使用整型表示字符串
因为字符集和校对规则,使处理字符比整型更复杂
3.尽可能使用not null
这个值是很烦人的,建字段时请尽量指定是否非空,NULL使得索引,统计,比较都变得更复杂,而且索引尽量不要创建到可以为null的字段上
字符串类型
VARCHAR是可变长字符串
比定长字符串(CHAR)更节省空间,仅使用必要的空间另外VARCHAR需要额外字节记录字符串长度(不同情况需要字节数不同)
CHAR类型是定长字符串
开发中基本很少用(一些公司甚至基本上不考虑这种类型了),注意:字符串长度定义不是字节数,是字符数
日期和时间类型
datetime
使用8字节存储空间,保存从1001年到9999年的秒数。与时区无关,默认情况下,Mysql以一种可排序的格式显示它的值,例如:“2018-10-14 22:30:08”
SQL优化
1、查询尽量避免全表扫描,首先考虑在where、order by字段上添加索引
2、避免在where字段上使用NULL值,所以在设计表时尽量使用NOT NULL约束,有些数据会默认为NULL,可以设置默认值为0或者-1
3、避免在where子句中使用!=或<>操作符,Mysql只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE使用索引
4、避免在where中使用OR来连接条件,否则可能导致引擎放弃索引来执行全表扫描,可以使用UNION进行合并查询
select id from t where num = 30 union select id from t where num = 40;
5、尽量避免在where子句中进行函数或者表达式操作
6、最好不要使用
select * from t
用具体的字段列表代替"*",不要返回用不到的任何字段
7、in 和 not in 也要慎用,否则会导致全表扫描,如
select id from t where num IN(1,2,3)
如果是连续的值建议使用between and,
select id from t where between 1 and 3;
8、
select id from t where col like %a%;
模糊查询左侧有%会导致全表检索,如果需要全文检索可以使用全文搜索引擎比如es,slor