首页 > 其他分享 >索引的访问类型

索引的访问类型

时间:2024-02-26 22:35:39浏览次数:27  
标签:访问 part2 索引 single key 类型 table WHERE

创建表:

CREATE TABLE single_table ( 
id INT NOT NULL AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
KEY idx_key1 (key1),
UNIQUE KEY idx_key2 (key2),
KEY idx_key3 (key3),
KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;

const

  • 主键等值查询
SELECT * FROM single_table WHERE id = 1438;
  • 唯一二级索引等值查询(is null条件查询为ref)
SELECT * FROM single_table WHERE key2 = 3841;
注:查询条件都与常数比较,为多字段索引时需每个列满足条件。

ref

  • 普通二级索引等值查询
SELECT * FROM single_table WHERE key1 = 'abc';
  • 为多字段索引时需满足条件字段都与常数比较
SELECT * FROM single_table WHERE key_part1 = 'god like'; 
SELECT * FROM single_table WHERE key_part1 = 'god like' AND key_part2 = 'legendary';
SELECT * FROM single_table WHERE key_part1 = 'god like' AND key_part2 = 'legendary' AND key_part3 = 'penta kill';
    • 无效情况
SELECT * FROM single_table WHERE key_part1 = 'god like' AND key_part2 > 'legendary';
  • 二级索引is null条件查询
SELECT * FROM single_table WHERE key2 is null;
注:查询条件都与常数比较。

ref_or_null

  • 二级索引等值查询或者key is null条件
SELECT * FROM single_table WHERE key1 = 'abc' OR key1 IS NULL;
注:值为NULL的记录放在索引最左边。

 

range

  • 索引列需要匹配某个或某些范围的值
SELECT * FROM single_table WHERE key2 IN (1438, 6328) OR (key2 >= 38 AND key2 <= 79);
注:此处所说的使用索引进行范围匹配中的 `索引` 可以是聚簇索引,也可以是二级索引。

index

看下边这个查询:
SELECT key_part1, key_part2, key_part3 FROM single_table WHERE key_part2 = 'abc';
由于key_part2并不是联合索引idx_key_part最左索引列,所以我们无法使用ref或者range访问方法来执行这个语句。但是这个查询符合下边这两个条件:
  • 它的查询列表只有3个列:key_part1, key_part2, key_part3,而索引idx_key_part又包含这三个列。
  • 搜索条件中只有key_part2列。这个列也包含在索引idx_key_part中。
也就是说我们可以直接通过遍历idx_key_part索引的叶子节点的记录来比较key_part2 = 'abc'这个条件是否成立,把匹配成功的二级索引记录的key_part1, key_part2, key_part3列的值直接加到结果集中就行了。由于二级索引记录比聚簇索记录小的多(聚簇索引记录要存储所有用户定义的列以及所谓的隐藏列,而二级索引记录只需要存放索引列和主键),而且这个过程也不用进行回表操作,所以直接遍历二级索引比直接遍历聚簇索引的成本要小很多,设计MySQL的大叔就把这种采用遍历二级索引记录的执行方式称之为:index。

all

最直接的查询执行方式就是我们已经提了无数遍的全表扫描,对于InnoDB表来说也就是直接扫描聚簇索引,设计MySQL的大叔把这种使用全表扫描执行查询的方式称之为:all。

标签:访问,part2,索引,single,key,类型,table,WHERE
From: https://www.cnblogs.com/zhengbiyu/p/18035736

相关文章

  • 学java07数据类型
    基本类型数值类型整数类型:byte(1字节)-128到127;short(2字节)-32768到32767;int(4字节)-2147483648到2147483647;long(要在字数后面加L)(8字节)-9223372036854775808到9223372036854775807浮点类型:float(4字节)(要在字数后面加F);double(8字节)字符类型:char(2字节)单个符号或汉字字符串:string(不......
  • C语言进行时3-数据类型
    数据类型:整数类型:int,char,short,long,longlong(字节:4,1,2,8,8其中long在32位电脑中是4字节)1字节(byte)=8位(bit)浮点数类型:float,double,longdouble(字节:4,8)有效字数:7,15逻辑类型:&&(与),||(或),!(非)整数的输入输出%dint%uunsigned%ldlonglong%luunsignedlonglong......
  • redis常见的五种类型
    https://www.cnblogs.com/xkqwy/p/16353029.html 总结1.string类型写命令通过set关键字实现,set[key][value]读命令通过get关键字实现,get[key]2.list列表类型通过rpush、lpush,将一个或多个值向右或向左推入。rpush[key][value1][value2],将value值推入到列表的右端......
  • JavaScript中的包装类型详解
    JavaScript中的包装类型详解在JavaScript中,我们有基本类型和对象类型两种数据类型。基本类型包括String,Number,Boolean,null,undefined和Symbol。然而,当我们需要在这些基本类型上调用方法时,就需要用到JavaScript的包装类型。什么是包装类型?包装类型是JavaScript中的......
  • Redis扩展数据类型&命令
    StreamRedisStream是Redis5.0版本引入的一种新的数据类型,它是一个持久化的、可查询的、可扩展的消息队列服务。Stream类型的数据结构类似于一个日志系统,数据被添加到Stream的末尾,并且每个数据都会被分配一个唯一的序列号,这个序列号是按照时间顺序递增的。主体队列:Stre......
  • WPF|--XAML|--使用其它名称空间中类型
    关键字词XAML--使用其它名称空间中类型语法格式<!--{}括起来的表示占位符-->xmlns:{Prefix}="clr-namespace:{Namespace};assembly={AssemblyName}"示例<!--演示如何访问System名称空间中的基本类型,并将其映射为前缀"sys_mine:"--><UserControlx:Class="WpfAp......
  • Flutter 新建的Project Type类型对比
    FlutterApp构建一个标准FluterApp(统一管理模式)包含Dart层和平台层(iOS/Android)FlutterModule创建一个Flutter模块(三端分离模式)以模块的形式分别嵌入原生项目FlutterPackage纯Dart插件工程,不依赖Flutter仅包含Dart层的实现,通常用来定义一些公共库Flutter......
  • 《程序是怎样跑起来》第十一章访问硬件的方法
    作者从CPU与内存的关系入手,详细阐述了程序在执行过程中如何与内存进行交互。内存作为计算机中重要的存储设备,存储着程序运行所需的各种数据和指令。CPU通过内存地址来访问内存中的数据,而内存地址则是由程序中的变量和指令地址转换而来。这一过程中,涉及到了地址空间、地址转换、内......
  • 类的集成和类成员的访问控制
    1.被sealed修饰的类代表不能做为基类: 2.一个类最多只能有一个基类3.子类的访问级别不能超过父类的访问级别,可和父类的访问级别持平; 4.继承 5.当父类中的构造器有参数时,子类的构造器的写法6.由以上4、5点说明构造器是不能被子类所继承的:7.访问级别是受最上层级别......
  • 关于Windows上设置MySQL为外部可访问
    改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改"mysql"数据库里的"user"表里的"host"项,从"localhost"改称"%"1.mysql-uroot-pdtsdtsmysql>usemysql;mysql>updateusersethost='%&#......