链接
第一章 mysql 逻辑架构连接层——服务层——引擎层——存储层
【mysql支持插件式的存储引擎架构,将查询处理和其他系统任务以及数据的存储提取相分离】
mysql引擎第二章【优化分析】 SQL 执行顺序 JOIN 图 【索引】
1、索引是什么?
索引(index) 是帮助MYSQL高效获取数据的数据结构【排好序的快速查找数据结构】,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉树)结构组织的索引。2、索引的目的是?
提高查询效率,类比字典3、索引本身也很大,不可能全部存储在内存中,以索引文件的形式存于磁盘
【索引两大重点:查询和排序 ==》where 后面的是查询条件,order by 是排序条件】4、索引优势与劣势
5、索引分类
单值索引:即一个索引质保函单个列,一个表可以有多个单列索引
唯一索引:索引列的值必须唯一,但允许有空值
复合索引:即一个索引包含多个列
6、mysql索引结构
BTree 索引、Hash索引、full-text全文索引、R-Tree索引
BTree 索引
7.1、需要创建索引的情况
7.2、不需要创建索引的情况
8、性能分析
1、MySQL Query Optimizer:Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划,但不见得最优
2、MySQL常见瓶颈(通过cpu 、io 、 服务器的硬件进行分析)
CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候
IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
服务器硬件的性能瓶颈:top,free,iostat和vmstat来查看系统的性能状态3、通过explain的关键字进行分析
【explain介绍:
- 是什么==》(查看执行计划),使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MYSQL是如何处理SQL语句的,用于分析查询语句或是表结构的的性能瓶颈
-能干嘛==》
-怎么用==》 explain + SQL语句
字段解释:
id:表的读取顺序。
select_type:数据读取操作的操作类型。
possible_keys:哪些索引可以使用。
key:哪些索引被实际使用。
ref:表之间的引用。
rows:每张表有多少行被优化器查询
】4、id(查询序列号)
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
三种情况:
情况一:id相同,执行顺序由上至下
情况二:id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行(在内层的子查询序列,其等级越高)
情况三:(以上两种情况同时存在的时候)
注意框框是一个临时表
按照上面的规则进行排序
id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行,衍生=DERIVED
5、select_type(查询类型)
select_type:标注是什么类型的查询,主要是用于区别普通查询、联合查询、子查询等的复杂查询。
类型:
6、type(访问类型)
类型:
但是常见为下面的【上面的不用记】
排序(最好 --》 最差)
system > const > eq_ref > ref > range > index >All
【一般要求至少达到range 级别,最好能达到 ref】详解:
7、possible_keys 、key 和 key_len(可能用到索引、实际用到索引、长度)
8、ref(条件查询)
(显示使用到的条件查询,如果是常量就为const)
显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。
由key_len可知t1表的idx_col1_col2被充分使用,col1匹配t2表的col1,col2匹配了一个常量,即 ‘ac’。
查询中与其它表关联的字段,外键关系建立索引。9、rows(行数)
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。(越小越好)
每张表被优化器查询
把不合适的索引删除,慢慢优化
10、Extra (包含不适合在其它列中显示但十分重要的额外信息)
【Using filesort ---> 九死一生 、Using temporary ---> 十死无生 、 Using index ---> 幸运之子】例子
11、
12、
13、