Mysql执行计划2
文章
- 覆盖索引
- Using where 与 using join buffer
- impossible where
- SQL 优化
- 策略 1.尽量全值匹配
- 策略 2.最佳左前缀法则
- 策略 3.不在索引列上做任何操作
- 策略 4.范围条件放最后
- 策略 5.覆盖索引尽量用
- 策略 6.不等于要甚用
- 策略 7.Null/Not 有影响
- 自定定义为 NOT NULL
- 自定义为 NULL 或者不定义
- 策略 8.Like 查询要当心
- 策略 9.字符类型加引号
- 策略 10.OR 改 UNION 效率高
- 测试题
- 记忆总结
- 批量导入
- insert 语句优化;
- LOAD DATA INFLIE
前文-Mysql执行计划
覆盖索引
覆盖索引(Covering Index),一说为索引覆盖。
理解方式一:就是 select 的数据列只用从索引中就能够取得,不必读取数据行,MySQL 可以 利用索引返回 select 列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要 被所建的索引覆盖。
理解方式二:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数 据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的 数据就叫做覆盖索引
注意: 如果要使用覆盖索引,一定要注意 select 列表中只取出需要的列,不可 select *, 因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。 所以,千万不能为了查询而在所有列上都建立索引,会严重影响修改维护的性能。
Using where 与 using join buffer
Using where 表明使用了 where 过滤
using join buffer 使用了连接缓存:
show VARIABLES like '%join_buffer_size%'
EXPLAIN select * from t1 JOIN t2 on t1.other_column = t2.other_column
impossible where
where 子句的值总是 false,不能用来获取任何元组 (不可能存在的查询条件)
EXPLAIN select * from t1 where 1=2
EXPLAIN select * from t1 where t1.other_column =‘enjoy’ and t1.other_column = ‘edu’
SQL 优化
优化实战
策略 1.尽量全值匹配
CREATE TABLE `staffs`( id int primary key auto_increment,name varchar(24) not null default "" comment'姓名',age int not null default 0 comment '年龄', pos varchar(20) not null default "" comment'职位', add_time timestamp not null default current_timestamp comment '入职时间' )charset utf8 comment '员工记录表';
insert into staffs(name,age,pos,add_time) values('z3',22,'manage',now());insert into staffs(name,age,pos,add_time) values('july',23,'dev',now()); insert into staffs(name,age,pos,add_time) values('2000',23,'dev',now()); alter table staffs add index idx_staffs_nameAgePos(name,age,pos); EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25;
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev'
当建立了索引列后,能在 wherel 条件中使用索引的尽量所用
策略 2.最佳左前缀法则
如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引 中的列。
EXPLAIN SELECT * FROM staffs WHERE age = 25 AND pos = 'dev'
EXPLAIN SELECT * FROM staffs WHERE pos = 'dev'
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July'
策略 3.不在索引列上做任何操作
不在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换),会导致索引失效而转向 全表扫描
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';
EXPLAIN SELECT * FROM staffs WHERE left(NAME,4) = 'July';
策略 4.范围条件放最后
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' ;
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22;EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22 and pos='manager' 中间有范围查询会导致后面的索引列全部失效 EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age >22 and pos='manager'
策略 5.覆盖索引尽量用
尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少 select *
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22 and pos='manager'
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME = 'July' and age =22 and pos='manager'
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age >22 and pos='manager'
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME = 'July' and age >22 and pos='manager'
策略 6.不等于要甚用
mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July'; EXPLAIN SELECT * FROM staffs WHERE NAME != 'July';
EXPLAIN SELECT * FROM staffs WHERE NAME <> 'July';
#如果定要需要使用不等于,请用覆盖索引
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME != 'July';
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME <> 'July';
策略 7.Null/Not 有影响
注意 null/not null 对索引的可能影响
自定定义为 NOT NULL
EXPLAIN select * from staffs where name is null
EXPLAIN select * from staffs where name is not null
在字段为 not null 的情况下,使用 is null 或 is not null 会导致索引失效
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name is not null
自定义为 NULL 或者不定义
EXPLAIN select * from staffs2 where name is null
EXPLAIN select * from staffs2 where name is not null
Is not null 的情况会导致索引失效
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name is not null
策略 8.Like 查询要当心
like 以通配符开头(’%abc…’)mysql 索引失效会变成全表扫描的操作
EXPLAIN select * from staffs where name ='july'
EXPLAIN select * from staffs where name like '%july%'
EXPLAIN select * from staffs where name like '%july'
EXPLAIN select * from staffs where name like 'july%'
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name like ‘%july%’
策略 9.字符类型加引号
字符串不加单引号索引失效
EXPLAIN select * from staffs where name = 917
解决方式:覆盖索引 EXPLAIN select name,age,pos from staffs where name = 917
解决方式:请加引号
策略 10.OR 改 UNION 效率高
EXPLAIN select * from staffs where name='July' or name = 'z3'
EXPLAIN select * from staffs where name='July' UNION select * from staffs where name = 'z3'
解决方式:覆盖索引
EXPLAIN select name,age from staffs where name=‘July’ or name = ‘z3’
测试题
记忆总结
记忆总结:
- 全职匹配我最爱,最左前缀要遵守;
- 带头大哥不能死,中间兄弟不能断;
- 索引列上少计算,范围之后全失效;
- LIKE 百分写最右,覆盖索引不写*;
- 不等空值还有 OR,索引影响要注意;
- VAR 引号不可丢, SQL 优化有诀窍。
批量导入
insert 语句优化;
- 提交前关闭自动提交
- 尽量使用批量 insert 语句
- 可以使用 MyISAM 存储引擎
LOAD DATA INFLIE
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 load data INFILE '/soft/product3.txt' into table product_info
show VARIABLES like 'secure_file_priv'
- secure_file_priv 为 NULL 时,表示限制 mysqld 不允许导入或导出。
- secure_file_priv 为 /tmp 时,表示限制 mysqld 只能在/tmp 目录中执行导入导出,其他 目录不能执行。
- secure_file_priv 没有值时,表示不限制 mysqld 在任意目录的导入导出。 secure_file_priv=’’
答案:
Mysql执行计划2相关推荐
- mysql 执行计划 什么用_简述MySQL的执行计划的作用及使用方法
作为程序员,难免要和数据库打交道,一般情况下,我们不是DBA ,但是又要写很多SQL,因此SQL效率就成了很大的问题.关于SQL效率优化,除了要掌握一定优化技巧外, 还得有很多经验的积累,但是这里我们 ...
- mysql 执行计划extra_MySQL执行计划extra中的using index 和 using where using index 的区别...
www.linuxidc.com/Linux/2017-- mysql执行计划中的extra列中表明了执行计划的每一步中的实现细节,其中包含了与索引相关的一些细节信息 其中跟索引有关的using in ...
- mysql执行计划extra为null_MySQL执行计划extra解析
MySQL执行计划extra解析 mysql的执行计划最让人难以捉磨的地方就是extra栏位的提示了,这是由于其他的 栏位没有提供详细的信息,因此多一个栏位来附加额外的信息,以利于用户更好的理解 sq ...
- MySQL执行计划解读
MySQL执行计划解读 http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html MySQL执行计划解读 Explain语法 E ...
- mysql 执行计划extra_mysql执行计划explain type和extra
mysql执行计划,搞定type和extra就能优化大部分sql了.type为主,extra为辅. type: system表只有一行,MyISAM引擎. const常量连接,表最多只有一行匹配,通用 ...
- [数据库] ------ mysql 执行计划
mysql 执行计划 简单来说,mysql整体架构分为三块:应用层,逻辑层,物理层 应用层:负责与客户端交互,建立连接,返回数据,响应请求. 逻辑层:负责查询处理,事务管理等 物理层:实际物理磁盘上存 ...
- Mysql执行计划含义,mysql执行计划介绍
烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长.如何写好sql,学会看执行计划至关重要.下面我简单讲讲mysql的执行计划,只列出了一些常见的情况,希望对大家 ...
- MySQL执行计划extra中的using index 和 using where using index 的区别
本文出处:http://www.cnblogs.com/wy123/p/7366486.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些 ...
- mysql 执行计划 视频_MySQL执行计划的讲解
最近同事在执行线上执行一条MySQL的查询语句,数据的话在9000条左右,但使用左连接的时候查询速度大概在15秒左右~这速度确实是无法接受的~ 经过简单的修改,变为内连接的话,执行速度不到1秒. 下面 ...
- 【mysql执行计划 const eq_ref ref range index all】
mysql执行计划 const eq_ref ref range index all - man1s - 博客园
最新文章
- Linux操作系统(一:基本操作)
- 炸裂!微软重磅推出混合现实平台 Mesh、基于 Excel 的低代码语言 Power Fx,Ignite 2021 太精彩!...
- javascript中的事件问题的总结
- poj 1265 Area(pick 定理)
- mysql命令技巧_Mysql命令行技巧汇总
- 为什么要叫python-为什么叫Python
- 谷歌浏览器怎样通过检查验证图片路径问题
- 一步一步理解Paxos算法
- Android文件Apk下载变ZIP压缩包解决方案
- (十九)hashlib模块
- 帝国CMS7.5仿hao123漫画网站模板动态版
- dom技术解析xml下jaxp解析器详细代码
- 获取vue一个对象的所有属性_VUE中computed计算属性和data数据获取的问题
- 爱上MVC系列~过滤器实现对响应流的处理
- 思科路由器Ez***测试
- 搭建 Sql Server 2008 R2 Failover Cluster
- 中科院计算机研究方向-考研导师选择的一些建议
- iOS打包ipa无签名打包企业签
- yolov5导出onnx用netron.app可视化搜索
- 基于人工势场法的车辆编队轨迹规划matlab仿真验证
热门文章
- mysql之查询最近7天的数据
- 为什么说CLR是类型安全的
- redis-3.2.9安装
- matplotlib——散点图
- thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?...
- 【李宏毅2020 ML/DL】P25 ELMO, BERT, GPT
- 【python VS Code】调用自定义模块 ModuleNotFoundError: No module named XXX
- 该行已经属于另一个表 的解决方法
- 没有安装opencv的linux系统上运行基于opencv,Linux环境下安装OpenCV
- 清除iphone文件app连接服务器记录,“文件”中连接外置设备或服务器 - iPhone附带的APP - iPhone使用手册...