1.查看sql执行频率
1.show status like ‘com________’
show status like 'Innodb_rows_%';
2.定位低效率执行语句
1.慢查询日志
2.使用show processlist
3.explain分析sql执行计划
id
1.表的加载顺序
2.id越大则越先执行
3.id相同可以认为是一组 由上到下
select_type
SIMPLE
简单的select查询,查询中不包含子查询或者UNION
PRIMARY
查询中若包含任何复杂的子查询,最外层查询标记为该标识
SUBQUERY
在SELECT 或 WHERE 列表中包含了子查询
DERIVED
在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中
UNION
若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVED
UNION RESULT
从UNION表获取结果的SELECT
table
展示这一行的数据是关于哪一张表的
type
1.const
表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常量。const于将 "主键" 或 "唯一" 索引的所有部分与常量值进行比较
2.eq_ref
类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描
3.ref
非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)
4.rang
只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between , < , > , in 等操作。
5.index
index 与 ALL的区别为 index 类型只是遍历了索引树, 通常比ALL 快, ALL 是遍历数据文件。
6.all
将遍历全表以找到匹配的行
possible_keys
表示查询时可能使用到的索引
key
实际使用的索引
rows
扫描行的数量
extra
执行情况的说明和描述
1.using filestore 文件排序
2.using temporary 查询的临时表,order group
3.using index
使用的是本地的索引表
4.show profiling 来显示耗时时间
show profiling
show profile for query query_id
Status
状态信息
Duration
每一步所消耗的时间
CPU_user
每个用户占用的cpu
CPU_system
系统占用的cpu
5.trace分析优化器执行计划
索引的使用
使用索引
避免索引失效
1.全值匹配,对所有的列都指定具体的值
2.最左前缀法则
3.范围查询右边的列,不能使用索引
4.不要在索引列上进行运算操作, 索引将失效。
5.字符串不加单引号,造成索引失效。
6.尽量使用覆盖索引,避免select *using index and using where 是最高的
7.用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
8.以%开头的Like模糊查询,索引失效。
9.如果MySQL评估使用索引比全表更慢,则不使用索引。
9和10因为 再mysql 中 如果全表中 大部分是一样的数据 那么 不走索引是走全表。
10. is NULL , is NOT NULL <font color='red'>有时</font>索引失效。
这个是为什么 ?
11.. in 走索引, not in 索引失效。
12.单列索引和复合索引。尽量使用复合索引,而少使用单列索引
查看索引的使用情况
sql语句优化
插入大量数据
1.如果数据大量的话 使用load
1) 主键顺序插入
2) 关闭唯一性校验
3) 手动提交事务
insert
order by 语句
1.where 条件和Order by 使用相同的索引
2.Order By 的顺序和索引顺序相同
3.Order by 的字段都是升序,或者都是降序
fileSort
一次扫描算法 是在sort buffer 进行排序,排序时内存消耗比较大
解决:1.max_length_for_sort_data
2.sort_buffer_size 适当大一些
group by
1.如果是根据 索引进行分组的话,可以加上一个order by null 来提升效率
explain select age,count(*) from emp group by age order by null;
优化嵌套查询
1.使用连接查询
优化OR条件
OR的查询子句,如果要利用索引,则OR之间的每个条件列都必须用到索引 , 而且不能使用到复合索引; 如果没有索引,则应该考虑增加索引
union 替换 or :
优化分页查询
1.利用order by 进行操作,最后连接回表查询
select * from t_user t ,(select id from tb_user order by id limit 20000,10) a where a.id=t.id
2,适用于主键自增的表 转换为某个位置查询
select * from tb_item where id>1000000 limt 10;
使用sql提示
user index
ignore index
force index
应用优化
使用连接池
减少数据库的访问
cache
负载均衡
MySql 主从复制
分布式数据库架构
Mysql中查询缓存优化
查询数据的流程操作
查询缓存
解析器
预处理器
查询优化树
查询执行计划
查询执行引擎
api调用接口
查询缓存配置
SHOW VARIABLES LIKE 'have_query_cache';
是否支持缓存
SHOW VARIABLES LIKE 'query_cache_type';
是否开启查询缓存
SHOW VARIABLES LIKE 'query_cache_size';
查看查询缓存占用的大小
SHOW STATUS LIKE 'Qcache%';
查看查询缓存的状态变量
开启查询缓存
在 /usr/my.cnf 配置中,增加以下配置 :query_cache_type =1
0、是不走缓存的
1、是走缓存的
2、显式指定 SQL_CACHE 的SELECT语句才会缓存
查询缓存失效情况
1.SQL 语句不一致的情况
2.查询语句中有一些不确定的情况
如 : now() , current_date() , curdate() , curtime() , rand() , uuid() , user() , database() 。
3.不使用任何表查询语句
select 'A';
4.查询数据库表的时候不走缓存
select * from information_schema.engines;
5. 在存储的函数,触发器或事件的主体内执行的查询
6.表更改
则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除