mysql高级(explain执行计划)

一·、总体架构
在这里插入图片描述
二、配置文件解析

1、二进制日志log-bin : 进行主从复制
2、错误日志log-erroe : 默认关闭,记录严重警告和错误信息,每次启动和关闭的详细信息等
3、查询日志log :默认关闭,记录查询的sql语句,如果开启会降低sql的整体性能,记录sql语句要消耗资源
4、数据文件:

  • linux默认库路径:/var/lib/mysql/
  • frm文件:存放表结构
  • myd文件:存放表数据
  • myi文件:存放表索引

三、基本文件存储位置
在这里插入图片描述

四、sql语句解析过程(执行顺序)

  • FROM <left_table>
  • ON <join_condition>
  • <join_type> JOIN <right_table>
  • WHERE <where_condition>
  • GROUP BY <group_by_list>
  • HAVING <having_number>
  • SELECT
  • DISTINCT <select_list>
  • ORDER BY <order_by_condition>
  • LIMIT <limit_number>

图解执行顺序
在这里插入图片描述

五、Join的七中用法

1、左连接
在这里插入图片描述

sql:slect * from A  left join B on  A.key = B.key

2、右连接

在这里插入图片描述

sql:slect * from A  right join B on  A.key = B.key

3、内连接
在这里插入图片描述

sql:slect * from A  inner  join B on  A.key = B.key

4、左外连接
在这里插入图片描述

sql:slect * from A  left join B on  A.key = B.key where B.key is null

5、右外连接
在这里插入图片描述

sql:slect * from A  right join B on  A.key = B.key where A.key is null

5、全连接
在这里插入图片描述

sql:slect * from A  left join B on  A.key = B.key
		union
		select * from A right join B on A.key = B.key

7、外连接
在这里插入图片描述

sql:select * from A  left join B on A.key = B.key where  B.key  is null
		union
		select * from A right join B on A.key = B.key where A.key is null

存储引擎

InnoDB和MyISAM区别
在这里插入图片描述

索引简介

一、基础知识
1、概念

是帮助MYSQL高效获取数据的数据结构,本质是数据结构 目的:在于提高查找效率。排好序的快速查找数据结构
在数据之外,数据库维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上

2、优势

1)提高数据检索的效率,降低数据库的IO成本
2)通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗

二、mysql索引分类

1)单值索引 :即一个索引只包含单个列,一个表可以有多个单列索引
2)唯一索引 : 索引列的值必须唯一,但允许有空值
3)复合索引 : 即一个索引包含多个列

三、基本语法
1、创建

CREATE [UBIQUE] INDEX indexname ON table[columnname(length)...]
ALTER table ADD [UNIQUE] INDEX indexname  ON (columnname(length)...)

2、删除

DROP INDEX  [indexname] ON 	table

3、查看

SHOW INDEX indexname ON table

4、使用ALTER命令
在这里插入图片描述
四、索引结构
1、索引分类

1)BTREE索引
2)Hash索引
3)Full-text全文索引
4)R-Tree索引

2、哪些情况需要建立索引

1) 主键自动建立唯一索引
2) 频繁作为查询添加的字段应该建立索引
3) 查询中与其他表关联的字段,外键关系建立索引
4) 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
5) Where条件里用不到的字段不创建索引
6) 单键/组合索引的选择,(高并发下倾向组合索引)
7) 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
8) 查询中统计或分组的字段

3、哪些情况不需要建立索引

1) 表记录太少
2) 经常增删改的表
3) 数据重复且分布平均的表字段
注意:如果某个数据列包含许多重复的内容,为它建立索引九没有太大的实际效果

五、Explain执行计划
1、是什么

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而指导Mysql如何处理你的sql语句,分析查询语句或是表结构的性能瓶颈

2、用法

Explain + SQL语句

3、包含的信息
在这里插入图片描述
4、各字段解释

1、id :select查询的序列号,包含一组数字,表示查询中指向select子句或操作表的顺序
	1)id 相同,执行顺序由上到下
	2)id不同,如果是子查询,id的序号会递增,id值越大优先级越高,先被执行
	3)id相同不同,同时存在
2、select_type:查询类型
	1)SIMPLE:简单的select查询,查询中不包含子查询或者union
	2)PRIMARY:查询中若包含任何复杂的子部分,最外层被标记类此
	3)SUBQUERy:在select或where列表中包含了子查询
	4)DERIVED:在from列表中包含的自查被标记为DERIVED(衍生),mysql会递归执行这些子查询,把结果放在临时表
	5)UNION :若第二个select出现在union之后,则被标记为union;若UNION包含在from子句的子查询中,外层select则被标记为:DERIVEED
	6)UNION RESULT:从UNION表里获取结果的select
3、table:显示查询的表的名称
4、type:显示查询的类型	system>const>eq_ref>ref>range>index>ALL
	1)system:表只有一行记录等于系统表,这是const类型的特例,平时不会出现,可忽略
	2)const:表示通过索引一次九找到了,const用于比较primary 或者unique索引,若将主键置于where列表中,mysql就将该查询转换为一个常量。
	3)eq_ref:唯一索引扫描,对应每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描
	4)ref:非唯一性扫描,返回匹配某个单独值的所有行,本质上也是一种索引分为,返回所有匹配的某个单独值的行,然而,它可能会找到多个符合条件的行,所有属于查找和扫描的混合体
	5)range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了那个索引,一般就是在你where子句中出现了between 、<、>、 in等的查询,比全表扫描好
	6)index:full index scan,index于all的区别为index类型只遍历索引树,比ALL快,索引比数据小,(index和all都是读全表,但index读索引,all从硬盘中读取)
	7)all:full table scan ,将遍历全表以找到匹配的行
	一般来说,至少保证查询达到range基本,最好能达到ref
5、possable_keys:显示理论上能用到的索引,但实际不一定能用到
6、key:实际使用的索引,若为NULL,则未使用索引,查询中使用了覆盖索引,则该索引仅出现在key列表中
7、key_len:表示所有中使用的字节数,可通过列计算查询中使用的索引的长度,不损失精度的情况下,长度越短越好,key_len显示的值未索引字段的最大可能长度,并非实际长度,即key_len 根据表定义计算的,而不是通过表内检索出的
8、ref:显示所有的那一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
9、rows:根据统计信息及索引选用情况,大致估算出找到所需的记录需要读取的行数
10、Extra:包含不适合在其他列中显示但十分重要的额外信息
	1)using filesot:mysql会对数据使用一个外部的索引排序,而不是按照表内的所有顺序进行读取。mysql无法利用索引完成的排序称为“文件排序”
	2)using temporary:使用了临时表保存了中间结果,mysql在对查询结果排序使用了临时表,常见于order by和group by语句中
	3)using index:表示相应的select操作使用了覆盖索引,避免了访问表的数据行,效率不错。若同时出现using where ,说明索引被用来执行索引键值的查找。若没有同时出现using where,说明索引用来读取数据集而非执行查找动作
	4)using where:使用了where过滤
	5)using join buffer:使用了连接缓存
	6)impossible  where子句的值总是false,不能用来获取任何元组
	7)select tables optimized away:在没有group by子句的情况下,居于索引优化MIN/MAX操作或者对于MyISAM存储引擎的优化COUNT(*)操作,不必等到执行截断再进行计算,查询执行生成的阶段即可完成优化
	8)distinct:优化distinct操作,再找到第一匹配的元组后即停止找同样值的动作

5、例子

在这里插入图片描述
六、索引优化
1、 单表索引
2、 两表索引

1) LEFT JOIN 左连接右表建索引(左表都有)
2) RIGHT JOIN 右连接左表建索引(右表全有)

3、 三表索引

LEFT JOIN 建两个右表的索引
RIGHT JOIN 建两个左表索引

4、 Join优化建议

1) 尽量减少join语句中的NesteLoop的循环次数,“永远使用小结果集驱动大的结果集”
2) 优先优化NestedLoop(嵌套循环)的内层循环 3) 保证Join语句中被驱动表上的Join添加字段以及被索引
4) 当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要台吝啬JoinBuffer的设置

5、索引失效

1、 全值匹配我最爱
2、 最佳左前缀法则
3、 不在索引列上做任何操作(计算,函数,(自动或手动)类型转换),会导致索引失效而转向全表扫描
4、 存储引擎不能使用索引中范围条件右边的列
5、 尽量使用覆盖索引(只访问索引的查询和查询列一致),减少select *
6、 Mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
7、 Is null ,is not null 也无法使用索引
8、 Like以通配符开头(‘%abc’)会导致索引失效变为全表扫描(覆盖索引可解决两边都有百分号问题)
9、 字符串不加单引号索引失效
10、 少用or,用它来连接时会索引失效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值