首页
学习
活动
专区
工具
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),不同键值的行计算出来的哈希值也不一样。

55700

Mysql入门

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

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

    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

    36641

    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

    35231

    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.7K40

    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操作。

    39150

    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 数据表; 一般情况下,除非需要使用表中所有的字段数据,

    13410

    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.3K10

    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 如果查询是基于分区表的话, 会显示查询访问的分区

    19810

    java面试题

    UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外链接的第一行。...range: 只检索给定范围的行,使用一个索引来选择行。 ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。...< K[i - 1] 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-...,不依赖外部查询结果),dependent union(union中的第二个或随后的select查询,依赖外部查询结果) type:有几种值:system(表仅有一行(=系统表),这是const连接类型的一个特例...: 表中可能帮助查询的索引 key:选择使用的索引 key_len:使用的索引长度 rows:扫描的行数,越大越不好 extra:有几种值:Only index(信息从索引中检索出,比扫描表快),where

    11710

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

    可以看到,使用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.8K10

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

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

    1K00

    2024Mysql And Redis基础与进阶操作系列(6)作者——LJS

    在数据库中,如果你对两个表进行交叉连接查询(CROSS JOIN),结果会是这两个表的笛卡尔积,即每一行的组合会和另一个表的每一行组合在一起。这通常会产生大量的数据,因为行数是两个表行数的乘积。...外连接(Outer Join)是一种 SQL JOIN 操作,它允许从一个表中选择所有的记录,而无论是否在另一个表中有匹配的记录。 如果记录在另一个表中没有匹配,那么结果集中的值将为 NULL。...; 多行多列 查询返回的结果是一张临时表 子查询回显的数据类型 单行单列 返回的是一个具体列的内容,可以理解为一个单值数据; 单行多列 返回一行数据中多个列的内容; 多行单列 返回多行记录之中同一列的内容...、大于等于、小于、小于等于、不等于其中的其中的任何一个数据。...表示指定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。同理可以推出其它的比较运算符的情况。 表示指定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。

    11410

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

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

    1.8K10

    【MySQL 系列】MySQL 语句篇_DDL 语句

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

    32210

    第06章_索引的数据结构

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

    20420

    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

    4.1K30

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

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

    34510
    领券