sql语句优化步骤 (sql语句优化总结)

1、sql语句优化

低性能的sql语句,可以使用 explain 命令查看语句执行计划,包含了是否使用索引,使用什么索引,使用的索引的相关信息等

id:

表示子查询的执行顺序,id相同执行顺序自上而下

id不同,值越大,优先级越高,越先执行

id为null,表示一个结果集,不需要使用它进行查询,常出现在 union等查询语句中

select_type:查询类型

SIMPLE :简单查询,不包含子查询和union查询

PRIMARY :包含子查询的最外层查询类型

SUBQUERY :在select或where语句中包含的查询

DERIVED : 在from中包含的查询

UNION :在union 后的查询语句中

UNION RESULT :在union中获取结果集

table : 查询的数据表

type : 访问类型

const 直接按主键或唯一键读取

ALL 扫描全表数据

index 遍历索引

range 索引范围查找

index_subquery 在子查询中使用 ref

unique_subquery 在子查询中使用 eq_ref

ref_or_null 对Null进行索引的优化的 ref

fulltext 使用全文索引

ref 使用非唯一索引查找数据

eq_ref 在join查询中使用PRIMARY KEYorUNIQUE NOT NULL索引关联。

possible_keys : 可能使用的索引

为null时,表明改语句需要优化

key : 实际使用的索引

key_length : 索引长度

ref : 连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows : 返回估算的结果集数目

extra : 额外的信息说明

2、sql 生命周期

1.建立连接

2.拿到请求sql

3.解析并生成执行计划,执行

4.将数据读取到内存,并进行逻辑处理

5.发送给客户端

6.关闭连接,释放资源

3.大表数据查询

1.sql语句优化,索引优化

2.必要时可以加缓存,memcache 或 redis

3.主从复制,读写分离

4.垂直拆分,将一个大的系统拆分成多个小的系统

5.水平切分,即数据表拆分

4.SQL语句优化

4.1 尽量避免全表扫描,在 where 及 order by 涉及的列上建立索引

4.2 避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

4.3 避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描

4.4 避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

4.5 in 和 not in 也要慎用,否则会导致全表扫描

4.6 模糊查询前置百分号,也会导致全表扫描

4.7 在 where 子句中使用参数,也会导致全表扫描

4.8 避免在 where 子句中对字段进行表达式操作

4.9 避免在where子句中对字段进行函数操作

4.10 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算

5.其他

慢查询日志

主键尽量使用 自增ID,不用uuid

字段尽可能定义为not null

定义合适的字段类型

count(*)会忽略所有的列,直接统计所有列数,不要使用count(列名)

UNION ALL的效率高于UNION