1、为查询缓存优化你的查询
开启mysql查询缓存, 当一条sql语句在很多次数被调用的时候,可以开启缓存存放起来,查询结果就会被放到一个缓存中,这样后面的相同的查询就直接从缓存里面根据key获取结果。
2、增加表中常用于搜索的字段的索引
开启表中的字段的索引,利用索引来查询sql的话,可以大大减少sql查询时间,你可以用EXPLAIN关键字来看下自己的sql的运行情况
3、尽量缩小你的父查询和子查询的范围
当你执行一个查询的时候,应该尽量提供更多的筛选条件,缩小查询的范围,分页可以使用sql分页 limit 你需要的数据集长度,提前终止查询
4、避免 SELECT *
从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。应当尽量只获取需要的数据就好了
5、枚举类型使用ENUM 类型
ENUM类型是非常快和紧凑的。其保存的是 TINYINT。
6、垂直分割
“垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。(一般都是数据表量大,过多不常用的字段)
7、尽量用批量插入代替循环单条插入
数据量越大的时候 比较双方需要的执行时间差就越大,所以应该尽量使用批量插入数据,不要代码循环插入
8、避免多个范围条件
比如想查询某个时间段内登录过的用户
select user.* from user where login_time > '2017-04-01' and age between 18 and 30;
这个查询有一个问题:它有两个范围条件,login_time列和age列,MySQL可以使用login_time列的索引或者age列的索引,但无法同时使用它们。
9、尽量用union all代替union
union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。
10、避免在 where 子句中对字段进行 null 值判断
避免在 where 子句中对字段进行 null 值判断
11、ORDER BY 能使用有序索引排序,尽量使用有序索引来排序
mysql的排序有2种实现方式,一种是通过有序索引直接取得有序的数据结果集,一种是通过mysql的排序算法将存储引擎中的数据进行排序后,返回结果集,第一种优势在于消耗IO资源少,更减少查询时间。