1 尽量避免使用select * 用具体的字段列表代替 *

2 搜索单条数据 后面加上limit 1

3 使用like模糊查询的时候 %关键词% 索引失效 可使用%关键词

4 避免使用!= > < in not in 操作符 索引失效 全盘扫描

5 便面使用or条件 索引失效 可使用union all代替

6 尽量避免使用表达式、函数等操作作为查询条件

7 尽量避免大事务操作,提高系统并发能力

8 尽可能的使用 varchar/nvarchar 代替 char/nchar

9 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型

10 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及

update 的效率、并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大

量数据重复时,SQL查询可能不会去利用索引 一个表的索引数最好不要超过6个

11 如果在 where 子句中使用参数,也会导致全表扫描。

12 应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该

使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值

13 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

14 使用表的别名(Alias):当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上

.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

15 ,常见的简化规则如下:不要有超过5个以上的表连接(JOIN),考虑使用临时表或表变量存放中间

结果。少用子查询,视图嵌套不要过深,一般视图嵌套不要超过2个为宜

16 在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数

17 尽量使用“>=”,不要使用“>”

18 sql语句用大写,因为oracle 总是先解析sql语句,把小写的字母转换成大写的再执行

19 别名的使用,别名是大型数据库的应用技巧,就是表名、列名在查询中以一个字母为别名,查询速

度要比建连接表快1.5倍

20 最好不要使用触发器,触发一个触发器,执行一个触发器事件本身就是一个耗费资源的过程;如果能

够使用约束实现的,尽量不要使用触发器;不要为不同的触发事件(Insert,Update和Delete)使用相同

的触发器;不要在触发器中使用事务型代码。

21 我们应该为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用

UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志

22 EXPLAIN SELECT 查询用来跟踪查看效果,使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的

SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。

23 选择表合适存储引擎:
myisam: 应用时以读和插入操作为主,只有少量的更新和删除,并且对事务的完整性,并发性要求不是

很高的。
Innodb: 事务处理,以及并发条件下要求数据的一致性。除了插入和查询外,包括很多的更新和删除

。(Innodb有效地降低删除和更新导致的锁定)。对于支持事务的InnoDB类型的表来说,影响速度的主

要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自

动提交,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开

也可以),将大大提高性能。

24 优化表的数据类型,选择合适的数据类型:
原则:更小通常更好,简单就好,所有字段都得有默认值,尽量避免null。

25 mysql查询优化总结:使用慢查询日志去发现慢查询,使用执行计划去判断查询是否正常运行

26 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时

使用,而且count(1)比count(*)更有效率。

27 索引创建规则:

表的主键、外键必须有索引;

数据量超过300的表应该有索引;

经常与其他表进行连接的表,在连接字段上应该建立索引;

经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

索引应该建在选择性高的字段上;

索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

复合索引的建立需要进行仔细分析,尽量考虑用单字段索引代替;

正确选择复合索引中的主列字段,一般是选择性较好的字段;

复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果

是,则可以建立复合索引;否则考虑单字段索引;

如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

频繁进行数据操作的表,不要建立太多的索引;

删除无用的索引,避免对执行计划造成负面影响;

表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外

,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删

除时的性能,特别是对频繁更新的表来说,负面影响更大。

尽量不要对数据库中某个含有大量重复的值的字段建立索引