1.选择合适的字段属性
2.使用JOIN代替子查询
3.使用联合(UNION)来代替手动创建的临时表
4.使用索引
- 查询条件最好建索引(多条件可以建符合索引);
- 建索引的字段做非空约束,NULL会导致索引失效;
- 不使用NOT IN(NOT EXISTS代替)和!=,<>(使用<,>代替)操作;
5.优化查询
- 最好是在相同类型的字段间进行比较的操作;eg:
比如INT和BIGINT之间的比较 - 在建有索引的字段上尽量不要使用函数,计算进行操作
select id from t where substring(name,1,3) = ’abc’
select id from t where num/2 = 100 - 尽量少使用LIKE关键字
- 不要再where 条件非空判断,会索引失效全表扫描;eg:
select id from t where num is null - 索引不是越多越好,建索引能提高查询的效率,但是会降低插入或更新的效率;
- 存储引擎的选择
MyISAM : 不支持事务处理,读性能处理快,表级别锁;
InnoDB : 支持事务处理(ACID),设计目标是为处理大容量数据发挥最大化性能,行级别锁。
表锁:开销小,锁定粒度大,发生死锁概率高,相对并发也低。
行锁:开销大,锁定粒度小,发生死锁概率低,相对并发也高。