查询优化

在编写快速的查询之前,需要清楚一点,真正重要的是响应时间,而且要知道在整个SQL语句的执行过程中每个步骤都花费了多长时间,要知道哪些步骤是拖垮执行效率的关键步骤,想要做到这点,必须要知道查询的生命周期,然后进行优化,不同的应用场景有不同的优化方式,不要一概而论,具体情况具体分析。

可以看执行时间(由于数据量比较小,所以差别不是很明显)

create table user(id int,name varchar(10),phone varchar(11));alter table user add index idx_1(phone);

Join


A join B,一定是先找A,后找B吗?
不一定。MySQL会进行优化。但可以进行constraint_join制定,强制先后顺序。
小表Join大表这样比较好,A是外键,B是主键索引,A是驱动表,B是非驱动表。


将小表放进内存的 join buffer 缓冲区中
可以把默认的join_buffer_size=256K调大,根据你的硬件决定。

两个语句比较

返回结果一样
执行计划,看起来是一模一样的,没啥区别
执行时间也差不多

on的条件不参与join的运算

其他的一些优化点


# 索引优化分析案例

预先准备好数据

SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `itdragon_order_list`;
CREATE TABLE `itdragon_order_list` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id,默认自增长',`transaction_id` varchar(150) DEFAULT NULL COMMENT '交易号',`gross` double DEFAULT NULL COMMENT '毛收入(RMB)',`net` double DEFAULT NULL COMMENT '净收入(RMB)',`stock_id` int(11) DEFAULT NULL COMMENT '发货仓库',`order_status` int(11) DEFAULT NULL COMMENT '订单状态',`descript` varchar(255) DEFAULT NULL COMMENT '客服备注',`finance_descript` varchar(255) DEFAULT NULL COMMENT '财务备注',`create_type` varchar(100) DEFAULT NULL COMMENT '创建类型',`order_level` int(11) DEFAULT NULL COMMENT '订单级别',`input_user` varchar(20) DEFAULT NULL COMMENT '录入人',`input_date` varchar(20) DEFAULT NULL COMMENT '录入时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8;INSERT INTO itdragon_order_list VALUES ('10000', '81X97310V32236260E', '6.6', '6.13', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-28 17:01:49');
INSERT INTO itdragon_order_list VALUES ('10001', '61525478BB371361Q', '18.88', '18.79', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-18 17:01:50');
INSERT INTO itdragon_order_list VALUES ('10002', '5RT64180WE555861V', '20.18', '20.17', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-09-08 17:01:49');

逐步开始进行优化:

第一个案例:

select * from itdragon_order_list where transaction_id = "81X97310V32236260E";
--通过查看执行计划发现type=all,需要进行全表扫描
explain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--优化一、为transaction_id创建唯一索引create unique index idx_order_transaID on itdragon_order_list (transaction_id);
--当创建索引之后,唯一索引对应的type是const,通过索引一次就可以找到结果,普通索引对应的type是ref,表示非唯一性索引赛秒,找到值还要进行扫描,直到将索引文件扫描完为止,显而易见,const的性能要高于refexplain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--优化二、使用覆盖索引,查询的结果变成 transaction_id,当extra出现using index,表示使用了覆盖索引explain select transaction_id from itdragon_order_list where transaction_id = "81X97310V32236260E";

第二个案例

--创建复合索引
create index idx_order_levelDate on itdragon_order_list (order_level,input_date);--创建索引之后发现跟没有创建索引一样,都是全表扫描,都是文件排序
explain select * from itdragon_order_list order by order_level,input_date;--可以使用force index强制指定索引
explain select * from itdragon_order_list force index(idx_order_levelDate) order by order_level,input_date;
--其实给订单排序意义不大,给订单级别添加索引意义也不大,因此可以先确定order_level的值,然后再给input_date排序
explain select * from itdragon_order_list where order_level=3 order by input_date;

索引优化分析案例

预先准备好数据

SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `itdragon_order_list`;
CREATE TABLE `itdragon_order_list` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id,默认自增长',`transaction_id` varchar(150) DEFAULT NULL COMMENT '交易号',`gross` double DEFAULT NULL COMMENT '毛收入(RMB)',`net` double DEFAULT NULL COMMENT '净收入(RMB)',`stock_id` int(11) DEFAULT NULL COMMENT '发货仓库',`order_status` int(11) DEFAULT NULL COMMENT '订单状态',`descript` varchar(255) DEFAULT NULL COMMENT '客服备注',`finance_descript` varchar(255) DEFAULT NULL COMMENT '财务备注',`create_type` varchar(100) DEFAULT NULL COMMENT '创建类型',`order_level` int(11) DEFAULT NULL COMMENT '订单级别',`input_user` varchar(20) DEFAULT NULL COMMENT '录入人',`input_date` varchar(20) DEFAULT NULL COMMENT '录入时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8;INSERT INTO itdragon_order_list VALUES ('10000', '81X97310V32236260E', '6.6', '6.13', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-28 17:01:49');
INSERT INTO itdragon_order_list VALUES ('10001', '61525478BB371361Q', '18.88', '18.79', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-18 17:01:50');
INSERT INTO itdragon_order_list VALUES ('10002', '5RT64180WE555861V', '20.18', '20.17', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-09-08 17:01:49');

逐步开始进行优化:

第一个案例:

select * from itdragon_order_list where transaction_id = "81X97310V32236260E";
--通过查看执行计划发现type=all,需要进行全表扫描
explain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--优化一、为transaction_id创建唯一索引create unique index idx_order_transaID on itdragon_order_list (transaction_id);
--当创建索引之后,唯一索引对应的type是const,通过索引一次就可以找到结果,普通索引对应的type是ref,表示非唯一性索引赛秒,找到值还要进行扫描,直到将索引文件扫描完为止,显而易见,const的性能要高于refexplain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--优化二、使用覆盖索引,查询的结果变成 transaction_id,当extra出现using index,表示使用了覆盖索引explain select transaction_id from itdragon_order_list where transaction_id = "81X97310V32236260E";

第二个案例

--创建复合索引
create index idx_order_levelDate on itdragon_order_list (order_level,input_date);--创建索引之后发现跟没有创建索引一样,都是全表扫描,都是文件排序
explain select * from itdragon_order_list order by order_level,input_date;--可以使用force index强制指定索引
explain select * from itdragon_order_list force index(idx_order_levelDate) order by order_level,input_date;
--其实给订单排序意义不大,给订单级别添加索引意义也不大,因此可以先确定order_level的值,然后再给input_date排序
explain select * from itdragon_order_list where order_level=3 order by input_date;

MySQL调优(四):MySQL索引优化实现细节相关推荐

  1. mysql优化零基础_MySQL8数据库 | MySQL调优|MySQL底层原理|MySQL零基础新手教程

    MySQL8数据库安装 一.Windows 环境下安装 Select Operating System: Microsoft Windows B.解压并配置MySQL环境变量 MYSQL_HOME: ...

  2. explain mysql 调优_explain mysql性能优化

    1 使用explain语句去查看分析结果,如 explain select * from test1 where id=1; 会出现: id  selecttype table  type possi ...

  3. 性能优化专题 - MySql 性能优化 - 04 - MySql调优

    目录导航 前言 Undo-log与Redo-log 案例 当前读.快照读 Redo Log的落盘配置 MySQL配置优化 MySQL服务器参数类型 快速定位MySql配置文件 MySQL内存参数配置 ...

  4. 开发人员MySQL调优-实战篇2-让SQL使用索引详解

    2019独角兽企业重金招聘Python工程师标准>>> 建议先看看开发人员MySQL调优-实战篇0 让执行的SQL使用索引 虽然DBA给我们建了很多索引,但没有经验的开发人员往往只看 ...

  5. MySQL 调优/优化的 101 个建议!

    转载自 MySQL 调优/优化的 101 个建议! MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适 ...

  6. “金三银四”春招指南之“性能调优”:MySQL+Tomcat+JVM,看完还怕面试官的轰炸?

    春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 01 MySQL性能调优 1.1 MySQL性能调优问题有哪些?怎么学? 关于这个,给大家看一份学习大 ...

  7. Mysql调优你不知道这几点,就太可惜了

    转载自  Mysql调优你不知道这几点,就太可惜了 一.Mysql的逻辑分层 Mysql分为:连接层.服务层.引擎层.存储层. 当客户端向服务端发起操作请求的时候,执行过程是这样的: 1.客户端端与M ...

  8. MySQL(用户管理,常用sql语句,数据库备份恢复,MySQL调优,恢复误操作数据)...

    一.MySQL用户管理. 一个MySQL数据库里可以跑多个库,总不能给所有人的程序员root用户,则可以给他们单独的用户访问数据库. 创建用户:(grant all on *.* to 'user1' ...

  9. MySQL调优篇:单机数据库如何在高并发场景下健步如飞?

    在当前的IT开发行业中,系统访问量日涨.并发暴增.线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代中一个炙手可热的名词,无论是在开发.面试过程中,性能优化都是一个常谈常新的话题.而MySQL作为整 ...

  10. 记录一次从小白开始的mysql调优(一)

    由于所负责的项目数据量不太大,之前较少涉及到mysql调优 首先遇到了一个例子,领导给了一条sql过来要求优化,这个还是比较简单的 一.去掉多余的字段以及函数 select count(1) from ...

最新文章

  1. novaclient的api调用流程与开发
  2. 如何打造企业的组织能力?战略决定组织,而组织决定成败!
  3. ubuntu docker用mount或volume与windows共享文件(samba)(设置共享ip地址)
  4. Java8--Lambda表达式对List集合操作
  5. elk 搜索 语法_ELK:kibana使用的lucene查询语法
  6. Java笔记-使用logback按天生成日志并按等级进行分类
  7. Mysql数据库从本地导出 服务器上导入时报 ERROR 2005 HY000 Unknown MySQL ser
  8. 使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
  9. git/SmartGit切换用户
  10. Eclipse 设置保护色
  11. 号码吉凶查询易语言代码
  12. 一篇文章教会你需求分析文档怎么写
  13. 公众号如何向用户发送重要的服务通知?
  14. 洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
  15. html5微信自动播放视频,科技常识:HTML5页面音视频在微信和app下自动播放的实现方法...
  16. 移动互联网安全技术研究
  17. 0基础入行学习软件测试有哪些要求?往往只有这3点
  18. 五万块钱买什么车好_5万元以下新车5万左右买什么车好
  19. 常用前端技术有哪些?
  20. QT获取本机的IP地址、mac地址、mask地址和广播IP(Ubuntu QT环境下实现)

热门文章

  1. 国产浏览器 linux,360安全浏览器推出国产操作系统版,在deepin上架获得高度点赞...
  2. html 轮播图_JS拖拽专题(二)——「实战」滑动轮播图的那点事儿
  3. oracle 练习 50_萨克斯练习中的常用技巧
  4. POJ1228(稳定凸包问题)
  5. [USACO18JAN][luoguP4183 ]Cow at Large P
  6. IDA Pro逆向实战之Crackme(简单篇)
  7. cocos2d-x游戏实例(20)-纵版射击游戏(7)
  8. scrapy发送翻页请求
  9. 两张动图,彻底明白TCP的三次握手与四次挥手
  10. 万亿条数据查询如何做到毫秒级响应?