Mysql优化

2018-04-15  本文已影响0人  大罡子

一.索引科普

主键索引

唯一索引

普通索引


单列索引

多列索引


聚簇索引

非聚簇索引


前缀索引

全文索引

二.优化的指标

1.响应事件

2.扫描行数

3.返回行数

explian所关心的参数如下:

type:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引

key:所用到的所以

rows: 扫描行数

三.查询优化策略

匹配索引查询优化

1.匹配主键,匹配唯一索引.索引的选择性越高,查询效率越高, 扫描的行数越少

2.避免NULL值查询

   避免like查询进行全表扫描

   避免在where语句中对索引进行复杂计算; where id + 1 = 2;

4.group by, distinct, order by, 关联查询on条件都要考虑匹配索引

查询语句策略优化

1.切分查询; 

    切分大数据量的in查询; 或者将in查询替换为exist语句; 用between代替in

    分解or查询为union查询

2.分解关联查询

3.关联查询时,分析sql的执行计划, 在连表之前进行数据过滤

具体的业务场景下, 达到业务目的sql会有不同的实现策略(join连表查询,子查询,联合查询), 实地的分析和选择最优的sql;

禁用select *

使用select count(*) 统计行数

尽量少运算

尽量避免全表扫描,如果可以,在过滤列建立索引

尽量避免在where子句对字段进行null判断

尽量避免在where子句使用!= 或者<>

尽量避免在where子句使用or连接

尽量避免对字段进行表达式计算

尽量避免对字段进行函数操作

尽量避免使用不是复合索引的前缀列进行过滤连接

尽量少排序,如果可以,建立索引

尽量少join

尽量用join代替子查询

尽量避免在where子句中使用in,not in或者having,使用exists,not exists代替

尽量避免两端模糊匹配 like %***%

尽量用union all代替union

尽量早过滤避免类型转换

尽量批量insert优先优化高并发sql,而不是频率低的大sql

尽可能对每一条sql进行explain尽可能从全局出发

上一篇下一篇

猜你喜欢

热点阅读