背景知识

在使用sql的过程中经常需要建立索引,而每种索引是怎么处罚的又是怎么起到作用的,首先必须知道索引和索引的类型。


索引类型type

我们可以清楚的看到type那一栏有index ALL eq_ref,他们都代表什么意思呢?

首先类型有许多,这里我只给大家介绍用的最多的几种类型:

system>const>eq_ref>ref>range>index>ALL

越往左边,性能越高,比如system就比ALL类型性能要高出许多,其中system、const只是理想类型,基本达不到;

我们自己实际能优化到ref>range这两个类型,就是你自己写SQL,如果你没优化基本上就是ALL,如果你优化了,那就尽量达到ref>range这两个级别;

左边基本达不到!

所以,要对type优化的前提是,你需要有索引,如果你连索引都没有创建,那你就不用优化了,肯定是ALL.....

Type级别详解

一.system级别

索引类型能是system的只有两种情况:

1.只有一条数据的系统表

只有一条数据的系统表,就是系统里自带一张表,并且这个表就一条数据,这个基本上就达不到,这个是系统自带的表,而且就一条数据,所以基本达不到;

2.或衍生表只能有一条数据的主查询

这个是可以实现的,但是在实际开发当中,你不可能去写一个这么个玩意儿,不可能公司的业务去让你把SQL索引类型写实system...

SQL语句:select * From (select * From test01) t where tid = 1;//前面需要加explain

执行结果:

就是把它凑出来即可;

我之所以能达到system,是因为我满足了它的第二个条件;

二.const级别

const条件稍微低一点,但是基本上也达不到;

1.仅仅能查出一条的SQL语句并且用于Primary key 或 unique索引;

这个我就不说了把,都知道,所以在企业里根本不可能实现,能查出来一条SQL语句,你的索引还必须是Primary key或unique;

SQL语句:select * tid From test01 where tid = 1;//前面需要加explain

执行结果:

根据tid找,因为tid是我设置的主键,主键就是Primary key,并且只能有一条数据,我表里面本来就一条,所以我满足了;

三.eq_ref级别

唯一性索引:对于每个索引键的查询,返回 匹配唯一行数据(有且只有1个,不能多,不能0);

解说:比如你select ...from 一张表 where 比方说有一个字段 name = 一个东西,也就是我们以name作为索引,假设我之前给name加了一个索引值,我现在根据name去查,查完后有20条数据,我就必须保证这二十条数据每行都是唯一的,不能重复不能为空!

只要满足以上条件,你就能达到eq_ref,当然前提是你要给name建索引,如果name连索引都没,那你肯定达不到eq_ref;

此种情况常见于唯一索引和主键索引;

比如我根据name去查,但是一个公司里面或一个学校里面叫name的可能不止一个,一般你想用这个的时候,就要确保你这个字段是唯一的,id就可以,你可以重复两个张三,但是你身份证肯定不会重复;

添加唯一键语法:alter table 表名 add constraint 索引名 unique index(列名)

检查字段是否唯一键:show index form 表名;被展示出来的皆是有唯一约束的;

以上级别,均是可遇不可求!!!!

四 .ref级别

到ref还是问题不大的,只要你上点心,就可以达到

非唯一性索引:对于每个索引键的查询,返回匹配的所有行(可以是0,或多个)

假设我现在要根据name查询,首先name可能有多个,因为一个公司或学校叫小明的不止一个人,但是你要用name去查,你必须name是索引,我们先给它加个索引,因为要达到ref级别,所以这里我给它加一个单值索引

单值索引语法:alter table 表名 索引类型 索引名(字段)

现在我们根据索引来查数据,这里我假设我写的单值索引;

alter table student add index index_name (name);

这个时候我们再去编写sql语句:

alter table student add index index_name (name);

因为name是索引列,这里假设有两个叫张三的,ref级别规则就是能查出多个或0个,很显然能查出来多个,那这条SQL语句,必然是ref级别!

执行结果:

数据:

五.range级别

检索指定范围的行,查找一个范围内的数据,where后面是一个范围查询 (between,in,> < >=);

注:in 有时会失效,导致为ALL;

现在我们写一个查询语句,前提是,tid一定是一个索引列,如果是id的话,就用主键索引,也就是唯一索引,值不可以重复,这个时候我们范围查询的时候要用它来做条件:

EXPLAIN SELECT t.* FROM student t WHERE t.tid BETWEEN 1 AND 2; ;//查询tid是1到2;

查看执行结果:

六.index级别

查询全部索引中的数据

讲解:假设我有一张表,里面有id name age,这个时候name是一个单值索引,一旦name被设定成索引,它就会成为B树一样,经过各种算法将name里面的值像树一样进行分类,这个时候我where name = **,就相当于把这颗B树查了一个遍,

也就是说,你把name这一列给查了一遍;

SQL语句:select id From student;//我只查被索引声明的列,必然就是index了;

执行结果:

七.ALL级别

查询全部表数据,就是select name From student;

其中 name 不是索引;

如果你查的这一列不是索引,就会导致全表扫描,所以要避免全表扫描

执行结果:


索引的分类:

主键索引(PRIMAY KEY)

唯一索引(UNIQUE)

常规索引(INDEX)

全文索引(FULLTEXT)

主键索引

主键:

  某一个属性组能唯一标识一条记录

  如:学生表(学号,姓名,班级,性别等等),学号时唯一标识的,可以作为主键

特点:

  最常见的索引类型

  确保数据记录的唯一性

  确定特定数据记录在数据库中的位置

实例:

CREATE TABLE `表名`(、

  `GradeID` INT(11)  AUTO_INCREMENT PRIMARY KEY,

  #或 PRIMARY KEY(`GradeID`)

唯一索引

作用:

避免同一个表中某数据列中的值重复

与主键索引的区别

  主键索引只能有一个

  唯一索引可有多个

实例:

CREATE TABLE `Grade`(、

  `GradeID` INT(11)  AUTO_INCREMENT PRIMARY KEY,

  `GradeName` VARCHAR(32) NOT NULL UNIQUE

  #或 UNIQUE KEY ` GradeID`(`GradeID`)

常规索引

作用:

快速定位特定数据

注意:

index 和 key 关键字都可以设置常规索引

应加在查询条件的字段

不易添加太多常规索引,影响数据的插入,删除和修改操作

实例:

##创建表时添加

CREATE TABLE `result`{

  //省略一些代码

  INDEX / KEY `ind` (`studentNo`,`subjectNo`)

}

##创建后追加

ALTER TABLE `result` ADD  INDEX `ind` (`studentNo`,`subjectNo`);

全文索引

作用:

快速定位特定数据

注意:

只能用于MyISAM类型的数据表

只能用于CHAR ,VARCHAR,TEXT数据列类型

使用大型数据集

实例:

CREATE TABLE `student`(

  #省略一些sql语句

    FULLTEXT(`StudentName`)

)ENDINE=MYISAM;

ALTER TABLE employee ADD FULLTEXT(`first_name`)

转载自: https://www.cnblogs.com/zhaokunbokeyuan256/p/10761548.html  转载请备注原处, 如有侵权请务必联系我,我会删除, 感谢

all index range ref eq_ref const system 索引type说明相关推荐

  1. all index range ref eq_ref const system 索引type说明

    背景知识 在使用sql的过程中经常需要建立索引,而每种索引是怎么处罚的又是怎么起到作用的,首先必须知道索引和索引的类型. 索引类型type 我们可以清楚的看到type那一栏有index ALL eq_ ...

  2. Oracle案例:index range scan真的不会多块读吗?

    团团圆圆吃汤圆,快快来三连 此次案例来自西安某客户的一次SQL优化,对于优化本身并不复杂,但是发现了一个比较有趣的问题,就是索引范围扫描以及回表都有使用多块读的方式.下面来看看具体案例. SQL文本: ...

  3. oracle创建索引index,【学习笔记】Oracle索引 创建含sysdate的函数index案例

    天萃荷净 分享一篇运维DBA需求,创建含sysdate的函数index案例 1.模拟Oracle数据库环境 创建表插入数据库 [oracle@node1 ~]$ sqlplus chf/oraclep ...

  4. oracle index range scan,INDEX RANGE SCAN (MIN/MAX)很慢的问题

    这个问题以前也遇到过,这是第二次了.这个问题比较有意思,一开始考虑的很多因素都被一一排除了,最后才发现问题所在.当使用select min(col1) from t或者select max(col1) ...

  5. 错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: int __thiscall osg::Referenced::ref(void)const “

    前言 错误 LNK2019 无法解析的外部符号 "__declspec(dllimport) public: int __thiscall osg::Referenced::ref(void ...

  6. pandas使用pivot_table函数构建透视表:index参数指定聚合的行索引、没有指定values参数则默认对所有数值列进行聚合、聚合函数为均值(mean)

    pandas使用pivot_table函数构建透视表:index参数指定聚合的行索引.没有指定values参数则默认对所有数值列进行聚合.聚合函数为均值(mean) 目录

  7. MySQL索引type级别意思

    我们可以清楚的看到type那一栏有index.ALL.eq_ref,他们都代表什么意思呢? 一文看懂MySQL索引type级别意思 索引type级别说明: system>const>eq_ ...

  8. mysql 查询优化 索引 type级别

    mysql查询速度优化 这是type级别 越左边 查询速度越快 system>const>eq_ref>ref>range>index>ALL 怎么样才能让type ...

  9. ibm3650m2 如何安装linux4,System x3650M2 (Type 7947) Windows Server 2008安装指南

    System x3650M2 (Type 7947) Windows Server 2008安装指南 一.安装前的准备 1.1安装前需要准备什么: 检查并升级主板IMM/UEFI到最新版本 一张有许可 ...

最新文章

  1. apache nginx禁止跨目录访问
  2. lnmp的搭建及php加速
  3. idea2020shezhi代码检查级别_优秀的模糊测试代码是如何炼成的?
  4. Csv数据库CsvDb
  5. android task详解,Android AsyncTask的使用详解
  6. 3.高性能MySQL --- 服务器性能剖析
  7. js表单验证 - 数字
  8. 读书笔记:程序员的工具箱之“代码片段”
  9. Maven 配置与依赖冲突问题
  10. 转换到coff期间_error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  11. Charles 实现电脑抓取手机包(解决手机不能上网问题)
  12. 视频I帧、P帧、B帧总结
  13. 17zwd获得17网商品详情接口 API 返回值说明,API接口获取方案
  14. 一文讲解电源技术中的安森美深力科NCP1680AAD1R2G CrM PFC控制器IC 详情讲解
  15. Linux下gcc/g++中-I(i的大写)、-L和-l
  16. 回收站清空了怎么恢复?快来get实用方法!
  17. 【开发利器】中国国内可用API合集
  18. 10-不用加减乘除做加法
  19. mysql 验证_使用MySQL验证Open***用户登录访问
  20. ES--深分页Scroll

热门文章

  1. 计算机 网络属性打不开,电脑上的本地连接属性打不开怎么处理?
  2. WFeB全球免费图书馆 World Free eBook
  3. “赛博空间之神”袁仁广
  4. 商业模式不是赚钱模式
  5. 大数据开发【3】 -- hadoop的云集群配置
  6. Android 9.0 10.0 开机后过滤部分通知声音(屏蔽一些杂乱通知声音)
  7. linux基础教程课后答案,Linux教材课后习题答案.pdf
  8. 转:腾讯4亿元投资KakaoTalk(韩国微信) 后者去年亏损7600万元
  9. ACM MM 2022 | 浙大提出BiSMAP:语义分割UDA 新SOTA!
  10. 为什么可见光是“可见”光?