自己学习日志
索引优化
-
为搜索字段、排序字段、select查询列,创建合适的索引,不过要考虑数据的业务厂家:查询多还是增删多
-
尽量建立组合索引并注意组合索引的创建顺序,按照顺序组织查询条件,尽量将筛选颗粒度大的条件放最左边
-
尽量使用覆盖索引,select 语句中尽量不要使用 *
-
order by 、group by 尽量要使用到索引
-
索引的长度尽量短,短索引可以节省索引空间,使得内存中可以装在更多的键值索引,太长的列可以选择建立前缀索引
-
索引更新不能太频繁,更新太频繁的数据不适合创建索引,因为维护索引的成本很大
-
order by 的索引生效,order by排序应该遵循最佳左前缀查询,如果是使用多个索引字段进行排序,那么排序的规则必然相同(同什同降),否则索引同样会失效
-
尽量避免索引失效,比如不正确的模糊查询,组合索引使用不遵循规则,or关键字,子查询建临时表耗费性能等
LIMIT优化
-
如果预计select命中的结果只有一条,那么可以使用limit 1 可以停止全表扫描
-
处理分页会使用limit,当翻页到非常靠后的页面是,偏移量会非常大,这是limit的效率会非常低,
-
limit offset size:其实就是offset的问题,导致MySQL扫描大量不需要的行然后抛弃掉
-
解决方案:
-
单表分页时,使用自增主键排序,先使用where id > offset limit后面只写rows
-
select * from (select * from test where id > 1000000 and id < 1000500 order by id) t limit 0,20;
-
其他查询优化
-
小表驱动大表,比如使用left jion时,因为使用join的话,第一张表是必须全变扫描的,所以如果一少关联多久可以减少扫描次数
-
避免全表扫描,MySQL在使用不等于 != 或 <> 的时候是无法使用索引的会导致全表扫描
-
避免MySQL放弃索引查询
-
特殊情况,当数据量少(几万)的时候,全表扫描会比使用索引快,则可以不使用索引
-
-
尽量不要使用count(*),而是使用count(主键)
-
count(*):遍历所有的行、列,查询行数
-
count(列):查询指定列不为null的行数,只查询了指定列
-
-
join两张表的关联字段最好都建立索引
-
select * from user u left join order o on u.id = o.user_id;
-
-
where条件中尽量不要使用not in 语句,建议使用not exists
-
合理使用慢查询日志,explain执行计划查询。show profile查询SQL执行时的资源使用情况