确定所储存的值(类型及是否定长)
varchar可变长度和char 长度固定(char 费空间,速度快; varchar 省空间,速度慢)
数字类型用数组类型存储,时间类型用时间类型存储,不要用字符类型存储
时间类型用字符串存储缺点: 这篇文章可以看看
- 字符串占用的空间更大!
- 字符串存储的日期比较效率比较低(逐个字符进行比对),无法用日期相关的 API 进行计算和比较。
选用字段长度最小
优先使用定长型
尽可能的定义 “NOT NULL”
数值型字段中避免使用 “ZEROFILL”
如果要储存的数据为字符串,且可能值已知且有限, 优先使用 enum 或 set
尽量不要使用定义外键
存储引擎(常用InnoDB)
MyISAM | InnoDB | |
简单了解 | 事务不安全,容易丢数据,不支持外键,但是查询速度快 | 事务安全,支持外键,增删改速度快 |
数据 | 索引和数据分开,经过压缩,数据量小 | 索引和数据捆绑,数据量大 |
读写性能 | 读强 | 写强 |
锁 | 锁整个表 | 行锁 |
语句
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开发手册