MySQL调优(四):MySQL索引优化实现细节
查询优化
在编写快速的查询之前,需要清楚一点,真正重要的是响应时间,而且要知道在整个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索引优化实现细节相关推荐
- mysql优化零基础_MySQL8数据库 | MySQL调优|MySQL底层原理|MySQL零基础新手教程
MySQL8数据库安装 一.Windows 环境下安装 Select Operating System: Microsoft Windows B.解压并配置MySQL环境变量 MYSQL_HOME: ...
- explain mysql 调优_explain mysql性能优化
1 使用explain语句去查看分析结果,如 explain select * from test1 where id=1; 会出现: id selecttype table type possi ...
- 性能优化专题 - MySql 性能优化 - 04 - MySql调优
目录导航 前言 Undo-log与Redo-log 案例 当前读.快照读 Redo Log的落盘配置 MySQL配置优化 MySQL服务器参数类型 快速定位MySql配置文件 MySQL内存参数配置 ...
- 开发人员MySQL调优-实战篇2-让SQL使用索引详解
2019独角兽企业重金招聘Python工程师标准>>> 建议先看看开发人员MySQL调优-实战篇0 让执行的SQL使用索引 虽然DBA给我们建了很多索引,但没有经验的开发人员往往只看 ...
- MySQL 调优/优化的 101 个建议!
转载自 MySQL 调优/优化的 101 个建议! MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适 ...
- “金三银四”春招指南之“性能调优”:MySQL+Tomcat+JVM,看完还怕面试官的轰炸?
春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 01 MySQL性能调优 1.1 MySQL性能调优问题有哪些?怎么学? 关于这个,给大家看一份学习大 ...
- Mysql调优你不知道这几点,就太可惜了
转载自 Mysql调优你不知道这几点,就太可惜了 一.Mysql的逻辑分层 Mysql分为:连接层.服务层.引擎层.存储层. 当客户端向服务端发起操作请求的时候,执行过程是这样的: 1.客户端端与M ...
- MySQL(用户管理,常用sql语句,数据库备份恢复,MySQL调优,恢复误操作数据)...
一.MySQL用户管理. 一个MySQL数据库里可以跑多个库,总不能给所有人的程序员root用户,则可以给他们单独的用户访问数据库. 创建用户:(grant all on *.* to 'user1' ...
- MySQL调优篇:单机数据库如何在高并发场景下健步如飞?
在当前的IT开发行业中,系统访问量日涨.并发暴增.线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代中一个炙手可热的名词,无论是在开发.面试过程中,性能优化都是一个常谈常新的话题.而MySQL作为整 ...
- 记录一次从小白开始的mysql调优(一)
由于所负责的项目数据量不太大,之前较少涉及到mysql调优 首先遇到了一个例子,领导给了一条sql过来要求优化,这个还是比较简单的 一.去掉多余的字段以及函数 select count(1) from ...
最新文章
- novaclient的api调用流程与开发
- 如何打造企业的组织能力?战略决定组织,而组织决定成败!
- ubuntu docker用mount或volume与windows共享文件(samba)(设置共享ip地址)
- Java8--Lambda表达式对List集合操作
- elk 搜索 语法_ELK:kibana使用的lucene查询语法
- Java笔记-使用logback按天生成日志并按等级进行分类
- Mysql数据库从本地导出 服务器上导入时报 ERROR 2005 HY000 Unknown MySQL ser
- 使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
- git/SmartGit切换用户
- Eclipse 设置保护色
- 号码吉凶查询易语言代码
- 一篇文章教会你需求分析文档怎么写
- 公众号如何向用户发送重要的服务通知?
- 洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
- html5微信自动播放视频,科技常识:HTML5页面音视频在微信和app下自动播放的实现方法...
- 移动互联网安全技术研究
- 0基础入行学习软件测试有哪些要求?往往只有这3点
- 五万块钱买什么车好_5万元以下新车5万左右买什么车好
- 常用前端技术有哪些?
- QT获取本机的IP地址、mac地址、mask地址和广播IP(Ubuntu QT环境下实现)
热门文章
- 国产浏览器 linux,360安全浏览器推出国产操作系统版,在deepin上架获得高度点赞...
- html 轮播图_JS拖拽专题(二)——「实战」滑动轮播图的那点事儿
- oracle 练习 50_萨克斯练习中的常用技巧
- POJ1228(稳定凸包问题)
- [USACO18JAN][luoguP4183 ]Cow at Large P
- IDA Pro逆向实战之Crackme(简单篇)
- cocos2d-x游戏实例(20)-纵版射击游戏(7)
- scrapy发送翻页请求
- 两张动图,彻底明白TCP的三次握手与四次挥手
- 万亿条数据查询如何做到毫秒级响应?