1、给WHERE子句和ORDER BY子句中涉及的列上加索引。
2、WHERE子句中尽量避免使用NULL判断,否则数据库会放弃使用索引,而进行全表扫描。
例如,下面这条语句就使用了NULL判断,它将会进行全表扫描:
SELECT * FROM person t WHERE t.age IS NULL;
应该为age字段设置特殊值,而不是使用NULL,比如age字段的值未知时,可以使用“-1”来代替NULL:
SELECT * FROM person t WHERE t.age=-1;
3、不要在WHERE子句中使用“!=”和“<>”运算符,如果使用了,数据库会放弃索引,而使用全表扫描。
4、尽量避免在WHERE子句中使用OR运算符,例如:
SELECT * FROM person t WHERE t.age=32 OR t.name='admin';
如果age上有索引,而name上没有索引,数据库会放弃使用索引,而进行全表扫描。
如果想要使用age列上的索引,可以使用下面的语句代替:
SELECT * FROM person t WHERE t.age=32
UNION ALL
SELECT * FROM person t WHERE t.name='admin';
5、尽量避免在WHERE子句中使用IN或NOT IN语句,否则可能导致数据库进行全表扫描。可以使用BETWEEN AND语句或EXISTS语句代替。
6、少使用模糊查询,模糊查询会导致数据库进行全表扫描,例如:
SELECT * FROM person t WHERE t.name like '%dmin%';
7、避免在WHERE子句中使用表达式,例如:
SELECT * FROM person t WHERE t.age/5=10;
可以改为:
SELECT * FROM person t WHERE t.age=10*5;
8、尽量避免在WHERE子句中使用函数。
9、注意,一个复合索引,如果在WHERE子句中没有使用到该索引的字一个字段,则数据库会放弃使用该索引。
10、表的索引数量不应太多。比如一些不常出现在WHERE子句中的列可以不加索引。
11、应该避免更新聚簇索引列。
12、使用varchar代替char,节省存储空间。
13、如果是MySQL数据库,请先将隔离级别设置为“读提交”(MySQL数据库的默认隔离级别是“可重复读”)。