Mysql执行计划与批量insert语句

执行计划:

id: 确定sql的执行的先后顺序
1、id相同按照从上到下
2、id不同大的优先执行
3、id相同也有id不同、那么执行顺序是先执行id越大的先执行,如果在执行的过程中发现id相同就从上到下执行
select_type:
1、simple: 简单的sql查询语句不包含子查询或者union
2、primary: 如果sql语句包含复杂的sql语句,那么最外层的sql为primary
3、subquery:包含子查询
4、derived: 存在第虚拟表
5、union:
1、出现在select之前
2、union包含在FROM子句的查询中,外层的select被标记为derived
6、union result:
取到结果
table
说明表的名字
type
system :说明表中只有只有一行数据
const: 通过索引一次性就能找出来(primary key或者unique索引),
eq_ref: 如果有两个表做关联查询,发现表中只有唯一一行记录与他匹配。(主键或唯一索引扫描)
ref: 如果一个表中一个字段建立了多个复合索引,那么查询条件中如果添加了索引列那么他就是ref索引 (额外的索引列)
range : 查询天健中代理between、< > in
index : 如果查询出来的字段都是索引字段。
ALL 如果查询一张表中的所有字段(存在一个问题就是如果表全部是索引字段那么查询出来type = index)
possible_keys 他表示查询出来可能走的索引
key : 当前sql语句所走的索引
key_len: 当前查询出来字段所占用的最大长度,并非实现长度
思考一: 为什么mysql执行计划为什么会出现该字段?
1、根据这个值可以判断索引的使用情况,特别是在组合索引的时候,判断所有的索引字段是否都是被查询到的
2、根据编码不同,他所在内存空间所占用的字节数各不一样?
latin占用一个字节、 gbk:占用2个字节 、 utf8占用三个字节
char 和 varchar 在内存中字节空间是如何计算的呢?
1、char :他们为两种情况 -——> 一种是当前字段可以存储null值、 一种是不能存储null值。
下面分别讨论:
not null 计算 ————————> 当前编码字节所占的空间
null 计算 ----————————> 当前编码
字节所占的空间 + 1
2、varchar 定义char一,唯一不同的就是null与not null在内存中所占用的空间不一样
下面分别讨论:
not null 计算 ————————> 当前编码字节所占的空间 + 2
null 计算 ----————————> 当前编码
字节所占的空间 + 1(null) + 2
3、整数/浮点数/时间类型的索引长度
NOT NULL=字段本身的字段长度
NULL=字段本身的字段长度+1(因为需要有是否为空的标记,这个标记需要占用1个字节)

  思考二:mysql他们如何判断当前选中的类型所占用的内存空间呢?  
    // mysql

ref:标识哪一个数据库.表.列 使用了索引 如果当前标记为const的话那么他条件后面就是个常量。

rows : 当前扫描出来的行数
extra:
Using filesort: 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
MySQL中无法利用索引完成的排序操作称为“文件排序”
Using temporary 使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by
USING index 是否用了覆盖索引
Using where 表明使用了where过滤
Using join buffer 使用了连接缓存:
Impossible where where子句的值总是false,不能用来获取任何元组


优化的总结:

1、尽量全值匹配
2、最佳左前缀法则
3、不在索引列上做任何操作
4、范围条件放最后
5、覆盖索引尽量用
6、不等于要甚用
7、Null/Not 有影响
8、Like查询要当心
9、字符类型加引号
10、OR改UNION效率高

上面怎么理解:
实例: 假如我们有一张学生表(name,age,sex),然后对三个字段添加索引;
1、尽量全值匹配 (背后的故事)
step2:尽量使用name=“xx” and age = “xx” and sex = “xx”
我们为什么要使用全值匹配呢?
1、为了提升效率
2、怎么判断当前索引字段使用是否生效呢?
根据 执行计划中 key_len ref
2、最佳左前缀法则
1、如果我们给name,age,sex建立联合索引
2、我们在查询语句中 使用 age =“xx” and sex =“xx” 当前索引失效

3、不在索引列上做任何操作
   1、 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换)
 
4、	范围条件放最后
  1、 这个是为什么? 因为范围查会导致当前索引后面的索引失效

5、覆盖索引尽量用	

LOAD DATA INFLIE;
使用LOAD DATA INFLIE ,比一般的insert语句快20倍

select * into OUTFILE ‘D:\product.txt’ from product_info

load data INFILE ‘D:\product.txt’ into table product_info

猜你喜欢

转载自blog.csdn.net/qq_30561643/article/details/103757182