避免向数据库查询不需要的数据
- 查询只需要的行和列,不需要的会增加开销
- 如果多次请求一行数据,可进行缓存,使用变量代替语句再次查询
- 避免使用select * 进行查询 ,需要什么取什么
- 分页查询,limit限制每次返回条数
- 如果是查询一条语句,使用limit 1 进行限制
分解大的查询
- 将大的查询分解成小查询
- 将关联查询分解,先进行单表查询,最后将结果进行关联
- 分解关联查询的优点:
- 增加缓存的效率,如果关联查询,如果其中一个变化,会导致全部缓存失效,单表则只不然
- 减少锁
- 增加查询的效率
- 更容易对数据库进行拆分,更容易做到高性能以及可拆分
查询数据的方式
- 查询数据的方式有全表扫描,索引扫描,范围扫描,唯一索引查询,常数引用等,速度从慢到快,扫描行从多到少
- 可以通过EXPLAIN语句检查查询语句效率进行选择
- 通过增加合适的索引改善查询数据方式,减少扫描的数据行,例如 在某表中如果某个字段总是被用来做搜索,可以为其建索引,但是当需要在一篇大文章中搜一个词时,索引可能没意义
优化关联查询
- 要确保ON或者USING子句中的列上有索引,并且在建立索引时需要考虑到关联的顺序
- 确保任何的GROUP BY和ORDER BY中的表达式只涉及到一个表中的列
优化LIMIT分页
- 当处理分页时,页数靠后时,偏移量非常大,此时的limit效率非常低,例如 limit(1000,10),优化此类查询最简单的办法就是尽可能地使用索引覆盖扫描,而不是查询所有的列。然后根据需要与原表做一次关联操作返回所需的列。
SELECT chen.id, `desc` FROM user
INNER JOIN
( SELECT id FROM user LIMIT 1000,10) AS chen
USING(id);
// 如果id为索引,通过索引搜索查询速度较快,先通过id查出1000-1010 这十条数据,再去关联本表,获取desc,返回相应的结果
其他优化
-
除非确实需要服务器消除重复的行,否则一定要使用UNION ALL
-
尽可能用关联替换子查询,可以提高查询效率。
-
尽量让MySql使用索引进行排序
-
用IN()取代OR
-
添加索引可以**优化MIN()和MAX()**表达式
-
当使用COUNT(*)时,统计的是行数,它会忽略所有的列而直接统计所有的行数。而在括号中指定了一个列的话,则统计的是这个列上值不为NULL的个数。可以考虑使用索引覆盖扫描或增加汇总表对**COUNT()**进行优化。