建表需要考虑什么?

确定所储存的值(类型及是否定长)

varchar可变长度和char 长度固定(char 费空间,速度快; varchar 省空间,速度慢)

数字类型用数组类型存储,时间类型用时间类型存储,不要用字符类型存储

时间类型用字符串存储缺点: 这篇文章可以看看

  1. 字符串占用的空间更大!
  2. 字符串存储的日期比较效率比较低(逐个字符进行比对),无法用日期相关的 API 进行计算和比较。

选用字段长度最小   

优先使用定长型       

尽可能的定义 “NOT NULL”            

数值型字段中避免使用 “ZEROFILL”            

如果要储存的数据为字符串,且可能值已知且有限, 优先使用 enum 或 set   

尽量不要使用定义外键

存储引擎(常用InnoDB)

 MyISAMInnoDB
简单了解事务不安全,容易丢数据,不支持外键,但是查询速度快事务安全,支持外键,增删改速度快
数据索引和数据分开,经过压缩,数据量小索引和数据捆绑,数据量大
读写性能读强写强
锁整个表行锁

语句

1.   多多利用 “explain”查询索引使用情况, 以便找出最佳的查询语句写法和索引设置方案        

2.   慎用 “select *”,查询时只选出必须字段         

3.   查询使用索引时,所遍历的索引条数越少,索引字段长度越小, 查询效率越高 (可使用 “explain”查询索引使用情况)         

4.   避免使用 mysql函数对查询结果进行处理,将这些处理交给客户端程序负责         

5.   使用 “limit”时候, 尽量使 “limit” 出的部分位于整个结果集的前部, 这样的查询速度更快, 系统资源开销更低         

6.   在 “where”子句中使用多个字段的 “and”条件时, 各个字段出现的先后顺序要与多字段索引中的顺序相符         

7.   在 “where”子句中使用 “like”时, 只有当通配符不出现在条件的最左端时才会使用索引         

8.   在 mysql 4.1以上版本中, 避免使用子查询, 尽量使用 “内/外连接”实现此功能         

9.   减少函数的使用,如果可能的话, 尽量用单纯的表达式来代替         

10.  避免在 “where”子句中, 对不同字段进行 “or” 条件查询, 将其拆分成多个单一字段的查询语句效率更高  

11. 查询时使用匹配的类型。例如select * from awhere id=5,如果这里id是字符类型,同时有index,这条查询则使用不到index,会做全表扫描,速度会很慢。正确的应该是… where id=”5” ,加上引号表明类型是字符。

索引

对于那些在查询中很少使用或者参考的列不应该创建索引。费空间

对于那些只有很少数据值的列也不应该增加索引。映射太少

对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 

当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。

1.   被索引的字段的长度越小,该索引的效率越高             

2.   被索引的字段中,值的重复越少, 该索引的效率越高             

3.   查询语句中,如果使用了 “group”子句, 根据其中字段出现的先后顺序建立多字段索引             

4.   查询语句中,如果使用了 “distinct”,根据其中字段出现的先后顺序建立多字段索引             

5.   “where”子句中, 出现对同一表中多个不同字段的 “and”条件时, 按照字段出现的先后顺序建立多字段索引            

6.   “where”子句中, 出现对同一表中多个不同字段的 “or”条件时, 对重复值最少的字段建立单字段索引             

7.   进行 “内/外连接”查询时, 对 “连接字段”建立索引             

8.   对 “主键”的 “unique” 索引毫无意义,不要使用。对于一个Primary Key的列,MySQL已经自动对其建立了Unique Index,无需重复再在上面建立索引了。   

9.   被索引字段尽可能的使用 “NOT NULL”属性             

10. 对写入密集型表,尽量减少索引, 尤其是 “多字段索引”和 “unique” 索引        

11. MySQL只会使用前缀,例如key(a, b) …where b=5将使用不到索引。

12. 控制单个索引的长度。使用key(name(8))在数据的前面几个字符建立索引

13. 相近的键值比随机好。Auto_increment就比uuid好。

遵循3大范式

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
通常我们用的最多的就是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)

第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。

第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

推荐:阿里巴巴Java开发手册

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值