mysql索引执行计划_第六章· MySQL索引管理及执行计划
一、索引介绍
1.为什么要做索引
让获取的数据更具有目的性,从而提高数据库检索数据的性能
2.索引类型介绍
1)BTREE:树索引 B+树索引 B*树索引
2)HASH:HASH索引
3)FULLTEXT:全文索引
4)RTREE:R树索引
innodb存储引擎使用BETREE
tree索引一个节点是一次I/O
mysql5.6/5.7用的tree和b+tree
2.1:树索引
树索引与B+树索引对比
1.与tree算法在查单点数据上I/O相同
2..优化了范围查询
3.在叶子节点添加了相邻节点的指针
2.2:B+树索引
2.3:B*树索引
3.索引管理
索引建立在表的列上(字段)的。
在where后面的列建立索引才会加快查询速度。
pages
3.1:索引分类
主键索引
创建语法:alter table 表名 add primary key 定义索引名(对添加索引的列名);
普通索引
创建语法:alter table 表名 add index 定义索引名(对添加索引的列名);
唯一索引
创建语法:alter table 表名 add unique key 定义索引名(对添加索引的列名);
3.2:添加索引
#添加普通索引
mysql> alter table student4 add index idx_name(name);
#查看表结构看索引
mysql> desc student4;
#查看建表语句,看索引
mysql> show create table student4;
#查看索引
mysql> show index from student4;
key_name(索引名) column_name(索引的列名) index_type(使用的算法)
#删除索引
mysql> alter table student4 drop index idx_name;
#添加主键索引
mysql> alter table abc add primary key pri_id(id);
#添加唯一索引
mysql> alter table student add unique key uni_age(age);
注意:添加唯一索引前需要先去重看数据是否唯一
#计算某列有多少行数据
mysql> select count(name) from student2;
#去重
mysql> select distinct(name) from student2;
#去重后计算某列有多少行数据
mysql> select count(distinct(name)) from student2;
3.3:前缀索引和联合索引
注意:添加索引会占据磁盘空间,需避免对大列建立索引,默认情况是按照BTREE算法排序,若必须要建立索引,可以选择给其加前缀,以减少索引所需的时间
应用场景:如需对列中较长的数据加索引,如对博客系统中的博文加索引
前缀索引
根据字段的前N个字符建立索引
alter table 表名 add index 定义索引名(对添加索引的列名(前缀字符数));
#添加前缀索引(以前四个字符为建立索引)
mysql> alter table student3 add index idx_name(name(4));
联合索引
多个字段建立一个索引(查询时有顺序要求)
例:
where a.女生 and b.身高 and c.体重 and d.身材好
index(a,b,c)
特点:前缀生效特性
a,ab,ac,abc,abcd 可以走索引或部分走索引
b bc bcd cd c d ba … 不走索引
#添加联合索引:对多个字段创建索引(如对age,sex,date创建索引 索引顺序为创建时的顺序 )
mysql> alter table student3 add index idx_all(age,sex,date);
总结:
1)需严格按照创建索引时的SQL语句中的索引顺序查询才可生效索引
2)创建联合索引前需先调查用户查询数据的需求量再进行添加联合索引
二、explain详解
explain命令使用方法
语法:explain 查询语句;
mysql> explain select name,countrycode from city where id=1;
type(索引扫描类型)
explain命令应用
查询数据的方式
1.全表扫描:
1)在explain语句结果中type为ALL
2)什么时候出现全表扫描
a)业务确实要获取所有数据
b)不走索引导致的全表扫描
c)没有索引
d)索引创建有问题
e)语句有问题
生产中,mysql在使用全表扫描时的性能是极其差的,所以MySQL尽量避免出现全表扫描
mysql> explain select * from city where district='heilongjiang';
2.索引扫描
常见的索引扫描类型:
1)index
2)range
3)ref
4)eq_ref
5)const
6)system
7)null
从上到下,性能从最差到最好,性能至少要达到range级别
index:Full Index Scan,index与ALL区别为index类型只遍历索引树。
mysql> alter table city add index idx_dis(district);
mysql> explain select District from city;
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行。显而易见的索引范围扫描是带有between或者where子句里带有查询。
mysql> alter table city add index idx_pop(population);
mysql> explain select * from city where population>30000000;
mysql> alter table city drop index idx_pop;
mysql> explain select * from city where population>30000000;
ref:使用唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。
mysql> alter table student3 add index idx_name(name(4));
mysql> explain select * from student3 where name='bgx';
eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件A
const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。
如将主键置于where列表中,MySQL就能将该查询转换为一个常量(主键或唯一建)
NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
Extra(扩展)
Using temporary
Using filesort 使用了默认的文件排序(如果使用了索引,会避免这类排序)
Using join buffer
如果出现Using filesort请检查order by ,group by ,distinct,join 条件列上没有索引
mysql> explain select * from city where countrycode='CHN' order by population;
当order by语句中出现Using filesort,那就尽量让排序值在where条件中出现
mysql> alter table city add index idx_pop(Population);
mysql> explain select * from city where population>2870300 and countrycode='CHN' order by population;
mysql> explain select * from city where population=2870300 and countrycode='CHN' order by population;
key_len(索引长度): 越小越好
前缀索引去控制
rows(行数,与结果集相关): 越小越好
案例:优化rows
一:
mysql> alter table city add index idx_name(name);
二:案例场景:比如说在电商平台中,商品索引展示,商品过多影响查询速率,可以使用索引加limit
查询结果集是原表中的大部分数据,应该是25%以上才能走索引
解决:
mysql索引执行计划_第六章· MySQL索引管理及执行计划相关推荐
- MySQL数据库https接口_第三章 mysql 数据库接口程序以及SQL语句操作
mysql 数据库接口程序以及SQL语句操作 用于管理数据库: 命令接口自带命令 DDL:数据定义语言(create drop ) DCL: 数据控制语言(grant revoke) DML: 数据 ...
- mysql的实验环境_第04 章 MYSQL实验环境创建
第04 章 MYSQL实验环境创建 一.下载MY https://dev.mysql.com/downloads/file/?id=476476 1.1 Oracle http://www.oracl ...
- mysql5.5从零开始_【MySQL函数】MySQL 5.5从零开始学第六章
说明:本文总结自:<MySQL 5.5从零开始学>第六章 MySQL中的函数包括: 数学函数.字符串函数.日期和时间函数.条件判断函数.系统信息函数和加密函数等. 函数: 表示对输入参数值 ...
- 系统架构师学习笔记_第六章(下)_连载
系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1 开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...
- java程序设计基础_陈国君版第五版_第六章例题
java程序设计基础_陈国君版第五版_第六章例题 class Cylinder {double radius;int height;double pi = 3.14;void area(){Syste ...
- 【信息系统项目管理师】第十六章 项目变更管理(考点汇总篇)
[信息系统项目管理师]第十六章 项目变更管理(考点汇总篇) 考点分析与预测 变更管理是项目整体管理的一部分,上午考题会出1分左右,已经包括在项目整体管理中.下午案例考变更管理的可能性也是很大的.如果论 ...
- IT项目管理总结:第六章 项目时间管理
第六章 项目时间管理 项目时间管理 –定义:确保项目按时完成所需的过程 –七个主要过程: A. 计划进度管理 B. 定义活动 C. 排序活动 D. 估算活动资源 E. 估算活动工期 F. 制订进度计划 ...
- 第六章 Qt布局管理器Layout
第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置.当用户改变窗口的大小,组件还静静地呆在原来的 ...
- 高性能mysql 第六章_第六章 查询性能优化
1. 为什么查询速度会慢 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化,无非是减少子任务数量,或者减少子任务的执行次数. 查询声明周期:生成计划,执行, ...
最新文章
- 深度学习中的图像分割:方法和应用、特点
- 【Java每日一题】20161128
- Spring Boot + Vue 前后端分离,两种文件上传方式总结
- mysql profiles清空_MYSQL 使用show profiles 分析性能
- [转] 用Diff和Patch工具维护源码
- 技术研究院003---六种方式,教你在SpringBoot初始化时搞点事情!
- 《C语言编程初学者指南》一导读
- fisco bcos应用开发(一) springboot报错 Error reading resource
- windows下命令行发送邮件blat.exe
- 电脑今天关机,第二天重启 解决方案
- python科学计算库-Scipy,主要讲解优化,方程求解,积分,蒙特卡洛,插值计算
- 远控免杀从入门到实践(2)工具总结篇
- Crate命令行客户端Crash
- java毕业设计医院管理系统Mybatis+系统+数据库+调试部署
- 反激电源电路电磁干扰抑制措施
- 关于Windows系统脚本(jscript)
- 23家上市公司抢先机落地区块链应用,政务、金融领域成果最吸睛
- 以太网PHY寄存器分析
- html清除js设置的浮动,css 怎么清除浮动
- Wi-Fi基带芯片和Wi-Fi无线网卡设计方案
热门文章
- WinForm之创建word并操作文档
- Head First JSP---随笔八(传统标记)
- STM32开发 -- 系统软复位
- string类的用法详解
- impala 连接mysql_impala系列: 基本命令和jdbc连接
- 【Java面试宝典】深入理解JAVA虚拟机
- Android O 前期预研之一:Android Treble 计划
- How to Visualize Your Recurrent Neural Network with Attention in Keras
- TensorFlow for Hackers - Part III
- 使用FlowDroid生成Android应用程序的函数调用图