MySQL查询基本概念_mysql 点查询 概念-程序员宅基地

技术标签: 数据库  

MySQL查询

MySQL索引基础知识,MySQL索引的优化,MySQL排序

索引结构

聚簇索引

聚簇索引:又称聚集索引,并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。
当表有聚簇索引时,它的数据行实际上存放在索引的叶子页(Leaf page)中,术语“聚簇”表示数据行和相邻的键值紧凑地存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引(不过,覆盖索引可以模拟多个聚簇索引的情况)。
InnoDB通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。InnoDB只聚集在同一页面中的记录。包含相邻键值的页面可能会相距甚远。

聚簇索引按照如下规则创建

  1. 当定义了主键后,innodb会利用主键来生成其聚簇索引;
  2. 如果没有主键,innodb会选择一个非空的唯一索引来创建聚簇索引;
  3. 如果这也没有,Innodb会隐式的创建一个自增的列来作为聚簇索引。

Note: 对于选择唯一索引的顺序是按照定义唯一索引的顺序,而非表中列的顺序, 同时选中的唯一索引字段会充当为主键,或者Innodb隐式创建的自增列也可以看做主键。
聚簇索引整体是一个b+树,非叶子节点存放的是键值,叶子节点存放的是行数据,称之为数据页,这就决定了表中的数据也是聚簇索引中的一部分,数据页之间是通过一个双向链表来链接的,上文说到B+树是一棵平衡查找树,也就是聚簇索引的数据存储是有序的,但是这个是逻辑上的有序,但是在实际在数据的物理存储上是,因为数据页之间是通过双向链表来连接,假如物理存储是顺序的话,那维护聚簇索引的成本非常的高。
详细引用来源

二级索引

二级索引保存的式行的主键值

索引结构图

三星查询

  1. 一星,索引将相关的记录放到一起;
  2. 二星,索引中的数据顺序和查找中的排列顺序一致;
  3. 三星,索引中的列包含了查询中需要的全部列。
CREATE TABLE `t_wms_sku` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sku_id` bigint(20) NOT NULL DEFAULT '0',
  `sku_name` varchar(50) NOT NULL DEFAULT '',
  `price` decimal(18,2) NOT NULL DEFAULT '0.00',
  `class3_id` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `udx_sku_id` (`sku_id`) USING BTREE,
  KEY `idx_class3` (`class3_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8195 DEFAULT CHARSET=utf8

在这里插入图片描述

type

type意味着类型,这里的type官方全称是“join type”,意思是“连接类型”,这样很容易给人一种错觉觉得必须需要俩个表以上才有连接类型。事实上这里的连接类型并非字面那样的狭隘,它更确切的说是一种数据库引擎查找表的一种方式,在《高性能mysql》称呼它为访问类型更贴切一些。
type显示的是访问类型,是较为重要的一个指标,结果值从最好到最差依次是:system>const>eq_ref>refindex>all

  1. all :Full Table Scan,将遍历全表以找到匹配的行。
    这便是所谓的“全表扫描”,如果是展示一个数据表中的全部数据项,倒是觉得也没什么,如果是在一个查找数据项的sql中出现了all类型,那通常意味着你的sql语句处于一种最原生的状态,有很大的优化空间。
    比如:explain select * from t_wms_sku where sku_name = '油菜(大棵/新鲜|斤)' ;
  2. index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从磁盘中读取的)。
    比如:explain select sku_id from t_wms_sku;
  3. range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是在你的where语句中出现了between、<、>、in等的查询,这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不会扫描全部索引。
    比如:explain select * from t_wms_sku where sku_id < 1249;
    explain select * from t_wms_sku where id < 1249
  4. ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引还能访问,它返回所有匹配某个单独值的行,然而,他可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
    通俗的解释:索引非唯一,条件用索引列=xxx
    比如:explain select * from t_wms_sku where class3_id = 555;
  5. eq_ref:唯一性索引扫描,对于每个索引键,表中都只有一条记录与之匹配。常见于主键或唯一索引扫描。
    比如:
explain
select s.*, p.* from t_wms_sku s 
inner join p_sku p on s.sku_id = p.id
  1. const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因此只匹配一行数据,所以很快,如将主键置于where列表中,mysql就能将该查询转换为一个常量。
    比如:explain select * from t_wms_sku where sku_id = 1238;
  2. system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计。

ref

表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

出现上述情况,因为MySQL的join是通过嵌套循环实现的。

Extra

  1. Distinct:MySQL is looking for distinct values, so it stops searching for more rows for the current row combination after it has found the first matching row.(MySQL正在寻找不同的值,因此在找到第一个匹配行之后,它不再为当前行组合搜索更多行。)平时不太关注。
  2. Using filesort:MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause. The keys then are sorted and the rows are retrieved in sorted order。(MySQL必须做一个额外的传递来查找如何按排序顺序检索行。排序是通过根据联接类型遍历所有行,并为匹配WHERE子句的所有行存储排序键和指向该行的指针来完成的。然后对键进行排序,并按排序顺序检索行。)
    注:看到这个一般就需要优化了,总而言之,排序没有用到索引,需要文件排序,文件排序
  3. Using index
    The column information is retrieved from the table using only information in the index tree without having to do an additional seek to read the actual row. This strategy can be used when the query uses only columns that are part of a single index.
    For InnoDB tables that have a user-defined clustered index, that index can be used even when Using index is absent from the Extra column. This is the case if type is index and key is PRIMARY.
    (综合一句话,索引覆盖查询,查询语句只查询了索引,没有真正扫描数据)
    在这里插入图片描述
  4. Using where
    A WHERE clause is used to restrict which rows to match against the next table or send to the client. Unless you specifically intend to fetch or examine all rows from the table, you may have something wrong in your query if the Extra value is not Using where and the table join type is ALL or index.
    Using where has no direct counterpart in JSON-formatted output; the attached_condition property contains any WHERE condition used.
    (表示优化器需要通过索引回表查询数据)
    Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown); Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yinzongchang/article/details/82872458

智能推荐

域名--泛解析-程序员宅基地

文章浏览阅读78次。背景:主域名下多数子域名访问后直接跳转至www域名的服务。百度百科--域名泛解析:在域名前添加任何子域名,均可访问到所指向的WEB地址。也就是客户的域名#.com之下所设的*.#.com全部。泛域名解析:利用通配符* (星号)来做次级域名以实现所有的次级域名均指向同一IP地址。子域名挖掘: 泛解析这个问题的解决方法很简单,向DNS请求*记录,然后把枚举子域名回来的..._dns枚举泛解析

基于对赋值为随机数的数组实现打印、求和及最大值、平均值的计算,排序问题_编写一个方法,对数组的元素用[0,100)之间的随机数进行初始化,初始化之后对数组进-程序员宅基地

文章浏览阅读206次。我们先定义一个数组x并为其分配储存空间,如下:int[] x=new x[100] 想要对数组中的每一个元素进行随机数赋值,需要用到循环控制语句,这里以for循环为例:定义一个变量i并赋值为0,作为for循环的起始条件;需要注意的是,数组的下标是从0开始的,比如x[0]到x[99],代表数组的长度为100。所以再写入判断语句的时候,不能写成a<=x.length;控制变量语句应写入自加语句。在循环体里,对x[a]进行随机数赋值,以0到100为例如图: 完成对x[a]的赋值之后,开始写入打印代_编写一个方法,对数组的元素用[0,100)之间的随机数进行初始化,初始化之后对数组进

为什么eMule总是未连接到服务器-程序员宅基地

文章浏览阅读1k次。<一>安装和版本问题1) eMule对Windows有什么要求?eMule能在Windows 95版本以上的Windows操作系统下运行。1个好的P2P软件需要好的拨号网络的支持,所以Windows 98和Windows ME的比较差网络运行情况可能会影响eMule的发挥;相对来说Windows 2000和Windows XP更适合使用eMule。2) 弹出错误信息说oleacc.dl..._emule v0.50b 最新服务器未连接

14 种编程语言书写关机脚本,真香_如何写强制关机脚本-程序员宅基地

文章浏览阅读2w次,点赞19次,收藏49次。批处理版本C 语言版本C++ 语言版本JAVA 语言版本C# 语言版本Python 语言版本NodeJS 语言版本PHP 语言版本Perl 语言版本Go 语言版本VB 语言版本SQL 语言版本树莓派 版本易语言 版本期待评论区故事的起源,有个家伙发来一个 BAT 的关机脚本,我顺手给改成了 八种语言的。_如何写强制关机脚本

docker compose搭建elasticsearch7集群_insufficient buffer remaining for aead cipher frag-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏7次。一、集群介绍系统环境:Centos7.5服务器节点:主机名 IP hadoop03 192.168.1.153 hadoop04 192.168.1.154 hadoop05 192.168.1.155 二、环境准备1、安装docker:略过2、安装docker compose1)使用官方推荐方式(此方式需服务器翻外网)curl -L "https://github.com/docker/compose/releases/download_insufficient buffer remaining for aead cipher fragment (2). needs to be more

Debian10安装部署DNS服务-正向解析篇_debian10安装powerdns-程序员宅基地

文章浏览阅读6k次,点赞7次,收藏39次。1、服务安装1.1、服务安装执行下面的命令安装apt install -y bind9 dnsutils1.2、配置文件作用服务安装完成之后,执行下面的命令查看配置文件列表ls -l /etc/bind然后得到下面的信息root@debian:~# ls -l /etc/bind总用量 48-rw-r--r-- 1 root root 2761 5月 18 16:02 bind.keys-rw-r--r-- 1 root root 237 5月 18 16:02 db.0_debian10安装powerdns

随便推点

Qt TCP服务端和客户端连接_qtcpserver怎么回去客户端ip-程序员宅基地

文章浏览阅读3.3k次。前言传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。如需了解UDP与TCP对比,可点击了解UDP和TCP对比。下面简单介绍下T_qtcpserver怎么回去客户端ip

保研福利|九月CS保研冲刺大礼包!-程序员宅基地

文章浏览阅读20次。将原资料精简打包只为你能轻装上阵,冲刺梦校!▼志愿填报手册【九推版本】▼填报有疑问?九推无offer?这里有超详细的志愿填报指南,助你填报无忧!超周到的防鸽策略&捡漏策略,助你成功上岸!叮咚!九月份岛主发送的福利已经“上门”啦~亲,注意查收哦~

探秘MIP-NeRF:谷歌的实时三维重建新利器-程序员宅基地

文章浏览阅读371次,点赞5次,收藏5次。探秘MIP-NeRF:谷歌的实时三维重建新利器项目地址:https://gitcode.com/google/mipnerf项目简介MIP-NeRF 是由谷歌研究团队推出的一项创新性项目,它基于神经辐射场(NeRF)技术,旨在实现更高效、更真实的3D场景重建和渲染。该项目的目标是将复杂的三维建模过程简化为一个快速、实时的过程,让用户体验到前所未有的视觉效果。技术解析NeRF(神经辐射场...

poj1703 犯罪团伙 并查集_poj 团伙 倍增并查集-程序员宅基地

文章浏览阅读710次,点赞2次,收藏2次。 在讲解这个题目之前, 我不得不狠狠的吐槽cin和cout的效率, 我提交了6遍都是超时, 最后一遍提交时统统把cin和cout改为scanf和printf才过的, 当时心情又高兴又难受. 查看题目点击这里 Find them, Catch them POJ - 1703吐槽完了, 开始讲题. 第一次遇见这种题目是感觉满头痛的, 咦~, 并查集不是将关系是朋..._poj 团伙 倍增并查集

LeetCode-14-最长公共前缀(C)_leetcode最长公共前缀 c-程序员宅基地

文章浏览阅读113次。文章首发及后续更新:http://mwhls.top/617.html新的更新内容请到mwhls.top查看。如果没有图片请到上方的文章首发页面查看。昨天刷题做二阶字符串指针的时候又出问题了,所以今天换了个简单难度的题。结果结果!我又出问题了!可恶!不过解决了:C语言二级字符串指针的使用(函数传参/长度获取/空间分配) 题目编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1:输入: ["f_leetcode最长公共前缀 c

java/php/node.js/python基于Java的医疗器械销售系统【2024年毕设】-程序员宅基地

文章浏览阅读32次。除了以上作品下面是2023-2024年最新100套计算机专业原创的毕业设计源码+数据库,是近期作品,如果你的题目刚好在下面可以文末领取java源码参考。后台主要是管理员,管理员功能包括首页、个人中心、用户管理、器械分类管理、器械商品管理、留言反馈、系统管理、订单管理等;springboot基于springboot的电子书阅读系统的开发与设计。springboot基于springboot的健康生活管理系统。springboot基于Android的小说阅读与创作的平台。