文章

  • 覆盖索引
    • 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相关推荐

  1. mysql 执行计划 什么用_简述MySQL的执行计划的作用及使用方法

    作为程序员,难免要和数据库打交道,一般情况下,我们不是DBA ,但是又要写很多SQL,因此SQL效率就成了很大的问题.关于SQL效率优化,除了要掌握一定优化技巧外, 还得有很多经验的积累,但是这里我们 ...

  2. mysql 执行计划extra_MySQL执行计划extra中的using index 和 using where using index 的区别...

    www.linuxidc.com/Linux/2017-- mysql执行计划中的extra列中表明了执行计划的每一步中的实现细节,其中包含了与索引相关的一些细节信息 其中跟索引有关的using in ...

  3. mysql执行计划extra为null_MySQL执行计划extra解析

    MySQL执行计划extra解析 mysql的执行计划最让人难以捉磨的地方就是extra栏位的提示了,这是由于其他的 栏位没有提供详细的信息,因此多一个栏位来附加额外的信息,以利于用户更好的理解 sq ...

  4. MySQL执行计划解读

    MySQL执行计划解读 http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html MySQL执行计划解读 Explain语法 E ...

  5. mysql 执行计划extra_mysql执行计划explain type和extra

    mysql执行计划,搞定type和extra就能优化大部分sql了.type为主,extra为辅. type: system表只有一行,MyISAM引擎. const常量连接,表最多只有一行匹配,通用 ...

  6. [数据库] ------ mysql 执行计划

    mysql 执行计划 简单来说,mysql整体架构分为三块:应用层,逻辑层,物理层 应用层:负责与客户端交互,建立连接,返回数据,响应请求. 逻辑层:负责查询处理,事务管理等 物理层:实际物理磁盘上存 ...

  7. Mysql执行计划含义,mysql执行计划介绍

    烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长.如何写好sql,学会看执行计划至关重要.下面我简单讲讲mysql的执行计划,只列出了一些常见的情况,希望对大家 ...

  8. MySQL执行计划extra中的using index 和 using where using index 的区别

    本文出处:http://www.cnblogs.com/wy123/p/7366486.html  (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些 ...

  9. mysql 执行计划 视频_MySQL执行计划的讲解

    最近同事在执行线上执行一条MySQL的查询语句,数据的话在9000条左右,但使用左连接的时候查询速度大概在15秒左右~这速度确实是无法接受的~ 经过简单的修改,变为内连接的话,执行速度不到1秒. 下面 ...

  10. 【mysql执行计划 const eq_ref ref range index all】

    mysql执行计划 const eq_ref ref range index all - man1s - 博客园

最新文章

  1. Linux操作系统(一:基本操作)
  2. 炸裂!微软重磅推出混合现实平台 Mesh、基于 Excel 的低代码语言 Power Fx,Ignite 2021 太精彩!...
  3. javascript中的事件问题的总结
  4. poj 1265 Area(pick 定理)
  5. mysql命令技巧_Mysql命令行技巧汇总
  6. 为什么要叫python-为什么叫Python
  7. 谷歌浏览器怎样通过检查验证图片路径问题
  8. 一步一步理解Paxos算法
  9. Android文件Apk下载变ZIP压缩包解决方案
  10. (十九)hashlib模块
  11. 帝国CMS7.5仿hao123漫画网站模板动态版
  12. dom技术解析xml下jaxp解析器详细代码
  13. 获取vue一个对象的所有属性_VUE中computed计算属性和data数据获取的问题
  14. 爱上MVC系列~过滤器实现对响应流的处理
  15. 思科路由器Ez***测试
  16. 搭建 Sql Server 2008 R2 Failover Cluster
  17. 中科院计算机研究方向-考研导师选择的一些建议
  18. iOS打包ipa无签名打包企业签
  19. yolov5导出onnx用netron.app可视化搜索
  20. 基于人工势场法的车辆编队轨迹规划matlab仿真验证

热门文章

  1. mysql之查询最近7天的数据
  2. 为什么说CLR是类型安全的
  3. redis-3.2.9安装
  4. matplotlib——散点图
  5. thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?...
  6. 【李宏毅2020 ML/DL】P25 ELMO, BERT, GPT
  7. 【python VS Code】调用自定义模块 ModuleNotFoundError: No module named XXX
  8. 该行已经属于另一个表 的解决方法
  9. 没有安装opencv的linux系统上运行基于opencv,Linux环境下安装OpenCV
  10. 清除iphone文件app连接服务器记录,“文件”中连接外置设备或服务器 - iPhone附带的APP - iPhone使用手册...