1.SQL上的优化
(1)尽量在子查询中增加过滤条件
比如:
create table person1( id int, name varchar(50), age int ); create table person2( id int, name varchar(50), age int ); 不推荐: SELECT * FROM person1 WHERE id in( SELECT id FROM person2 ) AND age > ?; 推荐: SELECT * FROM person1 WHERE id in( SELECT id FROM person2 WHERE age > ? );
(2)使用explain查看sql的详细信息。
比如 explain select * from person1 \G
\G表示显示竖版。
显示的一些详细参数,仔细研究后再补充。
(3)数据量大的时候需要避免扫描过多的记录,有以下几点需要注意:
a.建立合适的索引,比如在order by,where,group by,on从句等等上出现的字段。
b.索引字段越小越好。
c.离散度大的列放在联合索引前面。离散度大的指的是数值多样性多的。而联合索引类似(id1,id2)。
d.避免重复索引和冗余索引。
2.数据库表结构的优化
(1)int比varchar类型在mysql上处理简单。
(2)尽量存储数据的最小数据类型。
(3)少用text类型,若使用,单独用一张表存储。
(4)尽可能使用not null,设置默认值。
(5)数据库范式能够减少字段的冗余,但是适当情况下可以考虑反范式,以空间换时间。
(6)数据库的水平拆分:解决数据库单表数据量过多,将一张表水平拆分成多张表,遇到的问题:怎么在多张表中查询数据。
(7)数据库的垂直拆分:把原来一张表的列拆分,解决表的列的数量过多的问题。原则:常使用的列放在一个表,不常使用的列放在一张表,text字段单独放在一张表。