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

智能推荐

biubiubiu坐地铁 期望dp_n个座位地铁坐下人数的期望值-程序员宅基地

文章浏览阅读1.2k次。链接:https://ac.nowcoder.com/acm/contest/642/M来源:牛客网题目描述BiuBiuBiu 每次出去玩都要去坐地铁,BiuBiuBiu 观察到,当地铁上人比较少的时候,大家都会选择那些与其他人不相邻的座位,现在地铁上有 n 个座位排成一排,1 号座位与 2 号相邻,n 号座位与 n-1 号相邻,除了 1 号与 n 号座位,任意 i 号座位都与 i-..._n个座位地铁坐下人数的期望值

java 建立tlsv1.2报错,Java 8上的SQL Server JDBC错误:驱动程序无法使用安全套接字层(SSL)加密与SQL Server建立安全连接...-程序员宅基地

文章浏览阅读1k次。I am getting the following error when connecting to a SQL Server database using version the Microsoft JDBC Driver:com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secu..._java ssl 1.2指定还是报错

Linux命令_假设当前登录用户是root,执行cd ~-程序员宅基地

文章浏览阅读640次,点赞23次,收藏10次。本文介绍了部分Linux的命令,为学习使用_假设当前登录用户是root,执行cd ~

vue-aliplayer-v2直播解决需安装flash插件才能网页播放的问题-程序员宅基地

文章浏览阅读331次。vue-aliplayer-v2 ,直播,阿里云视频直播_vue-aliplayer-v2

Java Web3J概述_web3j是什么-程序员宅基地

文章浏览阅读9.7k次,点赞4次,收藏14次。Web3j是一个轻量级,Reactive(响应式),类型安全的Java库,用于与Ethereum网络上的客户端(节点)集成,这允许您使用Ethereum块链,而不需要为平台编写自己的集成代码的额外开销。 2.1 Web3J的提供的功能1. 通过HTTP和IPC 完成Ethereum的JSON-RPC客户端API的实现2. Ethereum钱包支持3. 使用过滤器的函数..._web3j是什么

VB 刷网站代码-程序员宅基地

文章浏览阅读89次。VB 刷网站代码 2011年03月18日  以下代码送给开网站的朋友们  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓ ↓↓↓↓第 一 种↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓代 码↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓  Dim..._网站刷pv源码 site:blog.csdn.net

随便推点

Android学习--Fragment-程序员宅基地

文章浏览阅读874次。学习目标:提示:这里可以添加学习目标例如: 一周掌握 Java 入门知识学习内容:提示:这里可以添加要学的内容例如:搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句学习时间:提示:这里可以添加计划学习的时间例如:周一至周五晚上 7 点—晚上9点周六上午 9 点-上午 11 点周日下午 3 点-下午 6 点学习产出:提示:这里统计学习计划的总量例如: 技术笔记 2 遍 CSDN 技术博客 3 篇 习的 vlog 视频 1

onsubmit阻止form表单提交与onclick的相关操作_阻止表单提交,为什么onclick必须要return ?-程序员宅基地

文章浏览阅读2.7k次。return false会阻止表单提交,基本上关于onsubmit=return false有以下几点要注意的地方,学习后台编程的朋友一定要知道。1. return 的返回值问题,函数中return一旦有返回值,就不在执行下面的语句,直接跳到函数调用的地方。如下PHP函数代码,第一个if条件符合则函数值返回布尔型false,可以返回一个函数的值,并且跳出这个函数;只要遇到return语_阻止表单提交,为什么onclick必须要return ?

Ext JS + jQTouch + Raphaël = Sencha _jqtouch与和sencha touch实验心得体会-程序员宅基地

文章浏览阅读2.6k次。好消息驾临了!是日于此刻,我们与jQTouch(http://www.jqtouch.com/)和Raphaël(http://www.raphaeljs.com/)两大项目强强联手,打造新的Sencha品牌,从而网站的网址就由www.extjs.com更名为www.sencha.com。jQTouch和Raphaël可以说在它们的各自领域都扮演着领头羊的角色,而我们能够携手jQTouch和Raphaël的作者,David Kaneda跟Dmitry Baranovskiy, 慧慧相识,共同一起见证参与_jqtouch与和sencha touch实验心得体会

E5 2696v2 和至强 e5-2680v2 哪个好 E52696v2 和 e52680v2对比_2696v2和2680v2哪个好-程序员宅基地

文章浏览阅读2.1k次。TDP 热设计功耗 (TDP) 120 W 三级缓存 30 MB 内存类型 DDR3 800/1066/1333/1600/1866。e52696v2 采用Ivy Bridge架构 22 nm制作工艺十二核心二十四线程主频2.5 GHz最大睿频3.3 GHz。E52680V2十核心二十线程,主频2.8最大睿频3.6,L3缓存25M,22纳米工艺。组装电脑选E5 2696v2还是E52680V2怎么搭配更合适这些点很重要。_2696v2和2680v2哪个好

matlab就业,基于MATLAB的就业数据的聚类分析-程序员宅基地

文章浏览阅读402次。一 基 于 MATLAB的 就 业 数 据 的 聚 类 分 析 邹 全 常程威 贾月月 (常州 工学 院 电气 与光 电工程学 院 ,江苏 常州 213100) 摘 要 :根据20lO年到2O13年我院校大学生就业情况 ,对大学生的就业数据进行 分析 。数据分析有很 多方法 .本 文主要 采用 谱 系聚类 、K均值 聚类、模糊C均值 聚类三种 聚类方法 ,并得 出了结论 。 关键词 :MATLAB..._matlab中聚类分析最多分析多少数据

mysql 大量close wait_线上大量CLOSE_WAIT原因排查-程序员宅基地

文章浏览阅读1k次。近日遇到一个线上服务 socket 资源被不断打满的情况。通过各种工具分析线上问题,定位到问题代码。这里对该问题发现、修复过程进行一下复盘总结。先看两张图。一张图是服务正常时监控到的 socket 状态,另一张当然就是异常啦!图一:正常时监控图二:异常时监控从图中的表现情况来看,就是从 04:00 开始,socket 资源不断上涨,每个谷底时重启后恢复到正常值,然后继续不断上涨不释放,而且每次达到..._mysql出现很多的close_wait,导致不能连接数据库

推荐文章

热门文章

相关标签