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