做为码农,不管是架构师还是普通开发人员,数据库的设计,表的设计是必不可少的一环,那么,怎样才能设计出一个符合规范,性能高的数据库呢?我分享一下最近学到的一些知识,如有不对的地方或者有更好的建议,欢迎交流!
1.表,字段的命名规范
命名很重要的一点是看表名就知道存的内容,看字段名就知道其含义,当然命名也有一定的规范:
存储形式 | 数据约束 | 索引列数量 | 可以创建的索引 |
聚集索引 | 主键索引 | 单列索引 | 主键索引 |
非聚集索引 | 唯一索引 | 组合索引 | 唯一索引 |
非唯一索引 | 普通索引 |
mysql默认的存储引擎是innodb,innodb索引结构采用的是B+TREE,那B+TREE的结构是什么样呢?
索引的命名规范:
除了命名规范还需要注意一些问题:
1. 有唯一特性的字段必须建成唯一 索引
2. 在 varchar 字段上建立索引时,必须指定索引长度
3. 建组合索引的时候,区分度最高的在最左边
在使用的时候要注意下面的问题,避免索引失效或者回表查询
1.防止因字段类型不同造成的隐式转换导致索引失效
2.利用覆盖索引来进行查询操作避免回表
3.如果有 order by 的 场景,请注意利用 索引的有序性
4.页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决
3.SQL规范
写sql语句的时候也要注意一些问题,罗列了一些,欢迎补充
1.SQL语句尽可能简单
2.保持事务(连接)短小
3.尽可能避免使用SP/TRIG/FUNC
4.尽量丌用 SELECT *
5.改写OR语句
6.避免负向查询和% 前缀模糊查询
7.LIMIT的高效分页
8.用UNION ALL 而非 UNION
9.分解联接保证高幵发
10.GROUP BY 去除排序
11.同数据类型的列值比较
12.Load data导数据
13.打散大批量更新
4.数据库的三大范式
第一范式:每列属性不可拆分
第二范式:表中每列都和主键相关
第三范式:每列都和主键直接相关,而不是间接相关
虽然有三大范式,也不必完全满足,主要还是根据自己的业务,如果一些冗余数据能更方便的操作数据库,且对性能没太大的影响,完全可以允许冗余数据的出现。