首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL性能优化(三):深入理解索引的这点事

[深入理解索引的这点事_logo.png] 前期回顾: MySQL性能优化(一):MySQL架构与核心问题 MySQL性能优化(二):选择优化的数据类型 索引,对于良好的数据库性能非常关键。...B-Tree定义数据记录为一个二元组key、data: key为记录的主键,即的主键值,用于记录唯一的数据,key值是唯一且互不相同的。 data为一行记录除主键外的数据。...p(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)。 注:ceil()为取整函数。 B-Tree的每个节点根据实际情况,可以包含大量的键值key、数据data、和指针p。...B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。...对于每一行数据,存储引擎都会对所有的索引列计算一个哈希值(hash value),不同键值计算出来的哈希值也不一样。

52300

Mysql入门

row:,指一行数据,一个可以有很多行。 record:记录,也是指一行数据。 column:列,指一列数据,一个可以有若干列。...主键就是一个数据的“关键值”,通过该关键值就可以找到该特定的数据一个的主键值不能重复(相等),比如文章的文章编号 id,比如用户的用户名。 主键字段必须有值(不能为空)。...实体与实体的关系 基本概念 实体(Entity): 指现实具体存在的可指称的“某物”。 一个一行数据实际就是指对某物的描述性数据,所以一行数据就是一个实体。...连接查询概述 连接查询,是将两个查询(或)的每一行,以“两两横向对接”的方式,所得到的所有的结果。 即一个的某行,跟另一个的某行,进行“横向对接”,而得到一个。 如下图所示: ?...自连接适用于一个的某个字段的值“来源于”当前另一个字段的情况。

1.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

01-03章 检索排序数据第1章 了解SQL第2章 检索数据第3章

的特性定义数据在如何存储,存储哪类数据,数据如何分解,各部分信息如何命名等。 模式(schema)用来描述数据库特定的,也可以用来描述整个数据库(和其中表的关系)。...主键(primary key) 有一列(或几列),用于唯一标识的每一行。...任何列作为主键的条件: 任意两行都不具有相同的主键值; 每一行都必须具有一个键值(主键列不允许NULL值); 主键列的值不允许修改或更新; 主键值不能重用(某行删除,它的主键不能赋给以后的新...第2章 检索数据 2.1 SELECT语句 用于从一个或多个检索信息,必须指定两条信息,想选择什么,什么地方选择。...关键字(keyword) 作为SQL组成部分的保留字,关键字不能用作或列的名字。 2.2 检索单个列 用SELECT语句Products检索名为prod_name的列。

2.6K10

MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)

为了描述 B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应的主键值,data 为一行记录除主键外的数据。对于不同的记录,key值互不相同。...P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1) B-Tree 的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个 3 阶的 B-Tree: 图片:DobbinSoong...,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示: 通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构...会选择数据不重复的列建立索引,如果没有符合的列,则 MySQL 自动为 InnoDB 生成一个隐含字段作为主键,并且这个字段长度为6个字节,类型为整型。...将被标记为DERIVED UNION RESULT:UNION获取结果的select table(显示这一行的数据是关于哪张的) type(显示查询使用了那种类型,最好到最差依次排列 system

32331

MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)

为了描述 B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应的主键值,data 为一行记录除主键外的数据。对于不同的记录,key值互不相同。...P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1) B-Tree 的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个 3 阶的 B-Tree: ?...会选择数据不重复的列建立索引,如果没有符合的列,则 MySQL 自动为 InnoDB 生成一个隐含字段作为主键,并且这个字段长度为6个字节,类型为整型。...将被标记为DERIVED UNION RESULT:UNION获取结果的select table(显示这一行的数据是关于哪张的) type(显示查询使用了那种类型,最好到最差依次排列 system...t2】 第五(执行顺序5):代表union的临时读取的阶段,table列的表示用第一个和第四个select的结果进行union操作。

2.1K40

MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余

为了描述 B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应的主键值,data 为一行记录除主键外的数据。对于不同的记录,key值互不相同。...P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1) B-Tree 的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个 3 阶的 B-Tree: ?...会选择数据不重复的列建立索引,如果没有符合的列,则 MySQL 自动为 InnoDB 生成一个隐含字段作为主键,并且这个字段长度为6个字节,类型为整型。...将被标记为DERIVED UNION RESULT:UNION获取结果的select table(显示这一行的数据是关于哪张的) type(显示查询使用了那种类型,最好到最差依次排列 system...t2】 第五(执行顺序5):代表union的临时读取的阶段,table列的表示用第一个和第四个select的结果进行union操作。

37450

MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)

为了描述 B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应的主键值,data 为一行记录除主键外的数据。对于不同的记录,key值互不相同。...P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1) B-Tree 的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个 3 阶的 B-Tree: 图片:DobbinSoong...,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示: 通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构...会选择数据不重复的列建立索引,如果没有符合的列,则 MySQL 自动为 InnoDB 生成一个隐含字段作为主键,并且这个字段长度为6个字节,类型为整型。...将被标记为DERIVED UNION RESULT:UNION获取结果的select table(显示这一行的数据是关于哪张的) type(显示查询使用了那种类型,最好到最差依次排列 system

35741

MySql知识体系总结(2021版)请收藏!!

通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。...SUBQUERY:子查询的第一个SELECT,取决于外面的查询 DERIVED:导出的SELECT(FROM子句的子查询) (3)table:名 (4)type:联接类型 system:仅有一行...eq_ref:对于每个来自于前面的组合,读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。...,使用一个索引来选择。...(8)ref:ref列显示使用哪个列或常数与key一起选择。 (9)rows:rows列显示MySQL认为它执行查询时必须检查的行数。

1.2K10

mysql数据库概念和基本语法(一)

有哪些非关系型数据库 键值型数据库 键值型数据库通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。...一个实体(instance)则对应于数据库一行(row),也称为一条记录(record)。...主要的语句关键字包括 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等。 SQL语言的规则与规范 SQL 可以写在一行或者多行。...个 必须只能包含 A–Z, a–z, 0–9, _共63个字符 数据库名、名、字段名等对象名中间不要包含空格 同一个MySQL软件,数据库不能同名;同一个不能重名;同一个,字段不能重名...FROM 语法: SELECT 标识选择哪些列 FROM 标识哪个选择 检索全部列: SELECT * FROM 数据; 一般情况下,除非需要使用中所有的字段数据,

10210

MySql性能优化

,次要索引,复合索引,前缀索引,唯一默认都是B+树索引 除B+树索引之外, 还有哈希索引(Hash index)等 二叉查找树 特性:左子树的键值小于根的键值,右子树的键值大于根的键值 B-Tree...非叶子结点的指针p[1],p[2],…p[m] 其中p1指向关键字小于k[1]的子树 3 < 8 p[m]指针关键字大于k[m-1]的子树 15 > 12 p[i]指向关键字属于(k[i-1],k[...设置主键 3NF 要求一个数据库不包含已在其它已包含的非主关键字信息 两张不要重复的字段 ,通常都是设置外键 大拆小,有大数据的列单独拆成小一个数据库,一般不会设计属性过多的...,进行综合的查询, 根据mysql自身的统计信息, 多种执行方案当中, 选择一个它认为是最优的执行方案,来去执行 做优化,做什么 做优化, 就是想让查询优化器按照我们的想法,帮我们选择最优的执行方案...UNION RESULT union获取结果select 两个UNION合并的结果集在最后 table 显示这一行的数据是关于哪张的 partitions 如果查询是基于分区的话, 会显示查询访问的分区

15710

为什么你创建的数据库索引没有生效?

可以看到,使用explain显示了很多列,各个关键字的含义如下: table:顾名思义,显示这一行的数据是关于哪张的; type:这是重要的列,显示连接使用了何种类型。...最好到最差的连接类型为:const、eq_reg、ref、range、indexhe和ALL; possible_keys:显示可能应用在这张的索引。如果为空,没有可能的索引。...可以为相关的域where语句中选择一个合适的语句; key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL选择优化不足的索引。...(重复数据较多的列) 假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问的2000个数据块。...再加上访问索引块,一共要访问大于200个的数据块。如果全扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全扫描访问的数据块少一些,肯定就不会利用索引了。

1.7K10

阿里二面:MySQL索引是怎么支撑千万级的快速查找?

它可以该面的一个磁道移动到另一个磁道,所有磁头都装在同一个动臂上,因此不同盘面上的所有磁头都是同时移动的(行动整齐划一),当盘片绕主轴旋转的时候,磁头与旋转的盘片形成一个圆柱体,各个盘面上半径相同的磁道组成了一个圆柱面...由于内存关键字一个有序结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。...B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示: 图片 通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点...因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是根节点开始,进行随机查找。...假设一行数据的大小是1k,那么一个页可以存放16这样的数据。

94100

干货|MySQL增、删、改查性能优化的10个小技巧

teminated by '分割符号' 主键优化 数据组织方式:   在MySQL的InnoDB引擎数据都是根据主键顺序组织存放的,这种存储方式的称为索引组织(Index Organized...每个页包含了2-N行数据(如果一行数据太大,会溢出),页数据根据主键排序【InnoDB规则每个页至少大于2,如果只有一行,证明形成了链表,在innodb是允许的】。...主键设计原则: 满足业务需求情况下,尽量降低主键的长度(因为二级索引叶子节点存储的是主键值,主键值越长,占用的空间越大,在搜索时需要耗费磁盘IO的次数就越多) 插入数据时,尽量顺序插入,选择使用AUTO_INCREMENT...InnoDB在count时,需要将数据一行引擎读取出来,然后累计计数(大数量的情况下是比较耗时的,主要是由存储引擎决定的)。...逻辑:引擎遍历全,但是不取值,服务层对返回的每一行都放一个数字"1"进去,直接进行累加操作。 count(列):统计字段值不为NULL的条数。

1.4K10

MySQL 系列】MySQL 语句篇_DDL 语句

该列的值 1 开始,每增加一个就会加 1。一个只能有一个自增列。...每插入一行,该列的值自动增加 ;⑦ 不像生成列,在插入新行时可以为自增列指定一个值 2.3.5、生成列 在 MySQL ,生成列(GENERATED COLUMN)是一个特殊的列,它的值会根据列定义的表达式自动计算得出...我们可以使用以下 3 个策略一个: CASCADE:如果被引用的一行被删除或更新,该匹配的值会自动删除或更新。...SET NULL:如果被引用的一行被删除或更新,该匹配的值设置为 NULL。...RESTRICT: 如果被引用的一行在该中有匹配的,试图删除或更新被引用的中行时会引发 MySQL 错误。这是默认的策略。

11710

第06章_索引的数据结构

Col 2 = 34 开始,进行比较,发现不是,继续下一行。我们当前的只有不到 10 行数据,但如果很大的话,有 上千万条数据 ,就意味着要做 很多很多次硬盘I/0 才能找到。...(2)通过创建唯一索引,可以保证数据库一行 数据的唯一性 。 (3)在实现数据的 参考完整性方面,可以 加速之间的连接 。...还拿 index_demo 为例,假设这个的数据是这样的: 如果二级索引目录项记录的内容只是 索引列 + 页号 的搭配的话,那么为 c2 列简历索引后的 B + 树应该长这样: 如果我们想新插入一行记录...⑤ InnoDB 要求 必须有主键 ( MyISAM 可以没有 )。如果没有显式指定,则 MySQL 系统会自动选择一个 可以非空且唯一标识数据记录的列作为主键。...MySQL 数据结构选择的合理性 # 6.1 全查询 这里都懒得说了。

15620

MySQL(二)数据的检索和过滤

使用频率最高的SQL语句应该就是select语句了,它的用途就是从一个或多个检索信息,使用select检索数据必须给出至少两条信息:想选择什么,以及什么地方选择 一、检索数据 1、检索单个列 select...,N表示的数量 select column from table limit X,Y; limit X, Y告诉MySQL返回X开始的Y;X为开始位置,Y为要检索的行数(limit带一个值总是一行开始...,给出的数为返回的行数;带两个值可以指定行号为第一个值的位置开始) 检索出来的第一行0而不是1,因此,limit1,1将检索出第二而不是第一行(在行数不够时,MySQL将只返回能返回的最大行数...column=X和Y的column2的(in操作符用来指定匹配值的清单的关键字,功能和or相当) 圆括号在where子句中还有另一种用法,in操作符用来指定条件范围,范围的每个条件都可以进行匹配;in...列出除column1为X,Y之外的所有column2的(not操作符用来否定后跟条件的关键字) not操作符有且只有一个功能,就是否定它之后所跟的任何条件 MySQL支持使用not对in、between

4K30

【愚公系列】2022年01月 Mysql数据库-MySQL索引

二、MySQL索引 1.索引的概念 我们之前学习过集合,其中的ArrayList集合的特点之一就是有索引。...为了描述BTree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应的主键值,data为一行记录除主键外的数据。对于不同的记录,key值互不相同。...,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。...MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值记录时最多只需要13次磁盘I/O操作。...另外索引过多的话,MySQL也会犯选择困难病,虽然最终仍然会找到一个可用的索引,但无疑提高了选择的代价。

32110

MYSQL锁学习笔记

其中访问类型(type)按照好到坏包括 system:只有一行 const:表格中最多只有一行匹配的数据,如使用主键进行查询 如select * from user_info where id =...t0时刻开启的事务只能读到t0时刻以及之前的提交的数据状态 序列化 脏读:一个事务未提交的语句会被另一个事务察觉 不可重复读:一个事务中提交的update语句会被另一个事务察觉 幻读:一个事务中提交的...insert语句会被另一个事务察觉 锁 锁主要分为锁和锁。...顾名思义,锁就是指对整张进行上锁,而行锁则是指针对一行数据进行上锁。锁通常在服务器层面实现,而行锁往往在存储引擎层实现。...这样别的级别锁来试图锁时,可以直接通过意向锁来判断该是否存在共享/排他锁,而无需对表的每一行判断是否有级锁,降低封锁成本,提高并发性能 意向锁和意向锁之间是兼容的,而意向锁和锁之间也是兼容

82420

MySql连接和状态查看方法

Handler_delete 请求从一张删除的次数。 Handler_read_first 请求读入一行的次数。 Handler_read_key 请求数字基于键读。...Handler_read_next 请求读入基于一个键的一行的次数。 Handler_read_rnd 请求读入基于一个固定位置的一行的次数。 Handler_update 请求更新一行的次数。...Handler_write 请求向插入一行的次数。 Key_blocks_used 用于关键字缓存的块的数量。 Key_read_requests 请求从缓存读入一个键值的次数。...Key_reads 磁盘物理读入一个键值的次数。 Key_write_requests 请求将一个关键字块写入缓存次数。 Key_writes 将一个键值块物理写入磁盘的次数。...Not_flushed_key_blocks 在键缓存已经改变但是还没被清空到磁盘上的键块。 Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的的数量。

4K10
领券