1, 尽可能地少进行连表查询。如果一定要进行连表查询,一定要消除笛卡儿积现象。对于MySQL是小表在前大表在后,Oracle是大表在前小表在后,并且这个相等字段一定要建一个主键。
2, 杜绝连表查询还带上子查询的方式。
3, 坚决杜绝做更新或者删除的时候带上子查询。在稍微大一点的访问量上就会造成上锁情况。
4, 需要什么字段就查询什么字段出来。别全部查询出来又不需要 。
5, 利用COUNT(1)代替COUNT(*)。如果我们只要一条结果请在后面加上 LIMIT 1.
6, 尽量少使用GROUB BY ORDER BY ,如果一定要使用,请尽可能给字段建立一个索引,并确保能够使用上索引。
7, 每一张表尽量有一个主键id(INT).
8, 使用Monyog监测数据库,可以很直观看见,访问数据的每一条sql的执行计划。跟使用EXPLAIN是一样的。
9, 建立好索引,优化好子查询,拆分复杂的sql为简单的sql.尽可能少在sql语句中调用函数,因为函数返回值总是变化的,这样无法利用MySQL的查询缓存功能。可以利用固定变量代替。也可以利用MySQL内部存储代码,这样可以节约带宽和网络延迟。但是会增加复杂性,可能耗服务器性能,调试问题难,还是最好利用应用程序。
10, 通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。
11, 只分配真正需要的空间。
12, 通常也尽量使用TIMESTAMP,因为它比DATATIME空间效率更高。
13, 一旦选定某种类型比如INT型作为主键,在所以关联表中都使用INT型。
14, 随机字符串,比如MD5(),SHA1()或者UUID()产生的字符串,会任意分配在很大空间内,将会导致INSERT以及一些SELECT语句变慢。并且随机值会使得缓存赖以工作的访问局部性原理失效。
15, 无符号整数存储IP地址。
16, MySQL中限制每个关联操作最多只能61张表,单个查询最好在12表以内做关联。
17, MySQL会在索引中存储NULL值,而Oracle则不会。
18, 范式设计数据库是好,但是有时候反范式也是必要的。做数据库设计时候尽可能两者兼顾起来,并且要提前明确是否需要统计信息,因为一旦设计到统计系统,如果表设计不好,到时候会关联很多表,数据量又大,直接会拖死服务器。
19, 不管怎样,注意细节问题并深刻理解索引,利用好索引,就可以了。索引也是一种数据结构。是一个非常关键的东西。它的顺序也十分重要。
20, 如果我们写SQL会出现这样多问题,为什么不利用ORM?大神们写的肯定比我们好。ORM毕竟不是AI,因为索引是复杂和精细的,很多时候SQL语句能够利用上索引的功能,是需要很多知识的。