什么是索引?

  • MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构。通俗的说,索引就相当于一本书的目录,能加快数据库的查询速度
  • 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。InnoDB存储引擎默认将索引文件和数据文件放在 .ibd文件
  • 我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。

使用场景: 数据库中表的数据量较大的情况下,对于查询响应时间不能满足业务需求,可以合理的使用索引提升查询效率。

索引的优缺点

优点

  • 可以加快数据的查询速度。大大减小了服务器需要扫描的数据量,提高数据检索的效率,减低数据库的IO成本。
  • 可以加快数据的排序操作。通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。另外索引可以将随机IO变成顺序IO。
  • 可以加快表之间的连接
  • 唯一索引可以保证表中每行数据的唯一性。

索引可以避免无索引行锁升级为表锁

缺点

  • 时间:创建索引和数据增删改时维护索引要耗费时间。 时间成本随着数据量的增大而加大。另外还会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长。另外如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
  • 空间:索引需要占据磁盘空间。

索引原理

索引一般以文件形式存在磁盘中(也可以存于内存中),存储的索引的原理大致概括为以空间换时间,数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,有多少条数据就要进行多少次查询,然后找到相匹配的数据就把他放到结果集中,直到全表扫描完。而建立索引之后,会将建立索引的KEY值放在一个n叉树上(BTree)。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表,每次以索引进行条件查询时,会去树上根据key值直接进行搜索。

磁盘IO与预读

磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间、旋转延迟、传输时间三个部分,开销巨大

局部性原理知,计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。故一次IO不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k

从 B+ 树的结构中可知,如果树高是 h 的话,访问一个叶子节点需要经过 h 次查询操作,也即访问 h 个节点。考虑索引实际上存储在磁盘上,载入索引节点的过程需要经历磁盘 I/O,B+ 树由于出色的高度控制,导致 h 的值不会太大,一般来说百万数量级可以控制在 2 ~ 4 左右,意为访问节点的数量主需要 2 ~ 4 个。

数据库系统的设计者又巧妙利用了磁盘预读原理,将一个节点的大小设置成一个页,这样每个节点只需要一次磁盘 I/O 就可以载入主存。这样的话,B+ 树访问一个叶子节点需要 h-1 次磁盘 I/O 就可以,因为其根节点是常驻内存的,极大减少了磁盘 I/O 次数,提高了索引结构的效率

MySql索引机制之磁盘I/O与磁盘预读

索引类型(InnoDB)

按功能逻辑分类

  • 主键索引(也是聚簇索引=聚集索引、密集索引=稠密索引)
    将数据与索引存放在一起,找到索引也就找到了数据。一张表只能有一个,不允许重复,不允许为NULL值。
    InnoDB表中,若没有显式指定主键,则InnoDB会自动检查表中是否有唯一索引的字段,如果有,则选择该字段为默认的主键;否则会自动创建一个6Byte的自增主键。

  • 非主键索引(也是稀疏索引、非聚集索引=辅助索引=二级索引
    将数据与索引分开,叶节点只有一个指针(书签)指向对应的数据块。

    • 普通索引 :基本的索引类型,没什么限制,一张表可以有多个,一个普通索引可以包含多个字段,允许数据重复,允许为NULL值
    • 唯一索引 :数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。如果是组合索引则列值的组合必须唯一。(建立唯一索引的目的大部分是为了该列数据的唯一性而不是查询效率)
    • 全文索引 :主要为了检索大文本数据中的关键字信息,只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。是目前搜索引擎使用的一种关键技术。(字段长度比较大时创建普通索引,在进行like模糊查询时效率比较低)
    • 前缀索引 :只适用于字符串类型如CHAR,VARCHAR,TEXT的数据,对前几个字符创建索引,可以指定索引列的长度,但是数值类型不能指定。
    • 空间索引(MYISAM存储引擎)

按列数逻辑分类

  • 单列索引 :一个索引只包含一个列,一个表可以有多个单列索引。
  • 组合索引(=复合索引=联合索引=多列索引): 一个组合索引包含两个或两个以上的列。查询的时候遵循 mysql 组合索引的 “最左前缀”原则,即使用 where 时条件要按照建立索引的时候字段的排列方式放置索引才会生效。
    一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用。

    • 覆盖索引(组合索引的最优情况)

物理分类 聚簇索引和非聚簇索引

  • 聚簇索引(=聚集索引)
    聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。
    Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。
    优点

    • 数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
    • 聚簇索引对于主键的排序查找和范围查找速度非常快

    缺点

    • 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
    • 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
    • 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
  • 辅助索引(=非聚簇索引=二级索引)
    在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。
    Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。
    辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。

聚集索引与非聚集索引的区别

  • 聚集索引一个表只可以有一个;非聚集索引一个表可以有多个
  • 聚簇索引的叶子节点就是数据节点,支持覆盖索引;非聚簇索引的叶子节点只有一个指针(书签)指向对应的数据块
  • 聚集索引中键值的逻辑顺序决定了表的物理顺序;非聚集索引则不是

何时使用聚簇索引与非聚簇索引

其他

  • 稠密(密集)索引: 在密集索引中,数据库中的每个搜索键值都有一个索引记录。这样可以加快搜索速度,但需要更多空间来存储索引记录本身。索引记录包含搜索键值和指向磁盘上实际记录的指针。

  • 稀疏索引: 在稀疏索引中,不会为每个搜索关键字创建索引记录。此处的索引记录包含搜索键和指向磁盘上数据的实际指针。要搜索记录,我们首先按索引记录进行操作,然后到达数据的实际位置。如果我们要寻找的数据不是我们通过遵循索引直接到达的位置,那么系统将开始顺序搜索,直到找到所需的数据为止。

相关数据结构

一文搞懂MySQL索引所有知识点

Hash表
范围查找时只能通过扫描全表方式
二叉查找树

左小右大。但插入数据有序时,会形成线性链表。

平衡二叉树
节点的子节点高度差不能超过1,解决了形成线性链表的问题。但没有利用好磁盘预读能力,每个节点不能够填满4K的内容,造成浪费
缺点

  • 时间复杂度和树高相关。树有多高就需要检索多少次,每个节点的读取,都对应一次磁盘 IO 操作。树的高度就等于每次查询数据时磁盘 IO 操作的次数。磁盘每次寻道时间为10ms,在表数据量大时,查询性能就会很差。(1百万的数据量,log2n约等于20次磁盘IO,时间20*10=0.2s)
  • 平衡二叉树不支持范围查询快速查找,范围查询时需要从根节点多次遍历,查询效率不高。


B树
一个绝对平衡树,所有的叶子节点在同一高度。在每个节点存储多个元素,在每个节点尽可能多的存储数据。每个节点可以存储1000个索引(16k/16=1000),这样就将二叉树改造成了多叉树,通过增加树的叉树,将树从高瘦变为矮胖。很好的利用操作系统和磁盘的数据交换特性以及磁盘IO的预读能力,将页大小设置为16K,即将一个节点(磁盘块)的大小为16K,一次IO将一个节点的内容加载进内存。磁盘IO次数变少了,查询数据的效率也就提高了。

B树使用场景:MongoDB

但非叶子节点也有数据,树高较大。

假设关键字类型为 int 4字节,若每个关键字对应的数据区也为4字节,不考虑子节点引用的情况下,则上图中的每个节点大约能够存储(16 * 1000)/ 8 = 2000个关键字,共2001个路数。对于二叉树,三层高度,最多可以保存7个关键字,而对于这种有2001路的B树,三层高度能够搜索的关键字个数远远的大于二叉树。


m阶B树满足以下条件

  • 每个节点至多可以拥有m棵子树。
  • 根节点,只有至少有2个节点(要么极端情况,就是一棵树就一个根节点,单细胞生物,即是根,也是叶,也是树)。
  • 非根非叶的节点至少有的Ceil(m/2)个子树(Ceil表示向上取整,图中5阶B树,每个节点至少有3个子树,也就是至少有3个叉)。
  • 非叶节点中的信息包括[n,A0,K1,A1,K2,A2,…,Kn,An],,其中n表示该节点中保存的关键字个数,K为关键字且Ki<Ki+1,A为指向子树根节点的指针。
  • 从根到叶子的每一条路径都有相同的长度,也就是说,叶子节在相同的层,并且这些节点不带信息,实际上这些节点就表示找不到指定的值,也就是指向这些节点的指针为空。

假如我们查询值等于10的数据。

相比二叉平衡查找树,在整个查找过程中,虽然数据的比较次数并没有明显减少,但是磁盘IO次数会大大减少。同时,由于我们的比较是在内存中进行的,比较的耗时可以忽略不计。B树的高度一般2至3层就能满足大部分的应用场景,所以使用B树构建索引可以很好的提升查询的效率。

可优化地方

  • B树不支持范围查询的快速查找,你想想这么一个情况如果我们想要查找10和35之间的数据,查找到15之后,需要回到根节点重新遍历查找,需要从根节点进行多次遍历,查询效率有待提高。
  • 如果data存储的是行记录,行的大小随着列数的增多,所占空间会变大。这时,一个页中可存储的数据量就会变少,树相应就会变高,磁盘IO次数就会变大。

B+树

  • B树:非叶子节点和叶子节点都会存储数据。
  • B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。

B+tree性质

  • n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引
  • 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接
  • 所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字
  • B+树中,数据对象的插入和删除仅在叶节点上进行
  • B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点

B+树结构

B+树的最底层叶子节点包含了所有的索引项。从图上可以看到,B+树在查找数据的时候,由于数据都存放在最底层的叶子节点上,所以每次查找都需要检索到叶子节点才能查询到数据。所以在需要查询数据的情况下每次的磁盘的IO跟树高有直接的关系,但是从另一方面来说,由于数据都被放到了叶子节点,所以放索引的磁盘块锁存放的索引数量是会跟这增加的,所以相对于B树来说,B+树的树高理论上情况下是比B树要矮的。也存在索引覆盖查询的情况,在索引中数据满足了当前查询语句所需要的全部数据,此时只需要找到索引即可立刻返回,不需要检索到最底层的叶子节点。

B+树一般一个节点有几个子节点?B+树有几层?为什么?B+树查找过程的I/O次数是怎么算的 参考 参考

B+ 树高度一般为 2-4 层,3层就能满足千万级的数据存储。一层读一个结点即一页即一次IO

  • 一个节点 = 一页 = 16k

    • 非叶子节点:设主键 id 为 bigint 类型 8 字节,而指针在源码中设置为 6 字节,共 14 字节。16k/14字节=1170个指针节点
    • 叶子节点:假设一行记录的数据大小为 1k,则一个节点有16行记录
  • 2层B+树可存 1170 * 16=18720条记录 1w+
  • 3层B+树可存 1170 * 1170 * 16=21902400条记录 2000w+

为什么用B+树 / b+树的优点(为什么B+树比红黑树要好)

  • B+树查询效率更高。B+树非叶子结点没有存储数据信息,一个结点可读入的关键字更多,树的高度更低,IO次数更少。
  • B+树的查询更稳定。B+树查询是从根节点到叶子节点,每个关键字的查询效率相当;B树越靠近根节点的记录查找时间越短
  • B+树增删效率更高。B+树叶子节点包含所有关键字,并以有序链表存储,便于增删
  • B+树支持顺序查询。B+树叶子节点顺序排列且相邻节点顺序引用
  • B+树支持范围查询。B+树只要遍历叶子节点就可以实现整棵树的遍历,实现范围查询

InnoDB为什么推荐使用自增ID作为主键?/ 自增 ID 和 UUID 的区别

自增ID可以保证每次插入时B+索引是从右边扩展的,避免B+树结点频繁合并和分裂。

**自增主键用完了怎么办? **参考

自增id达到最大值时,继续插入会报一个主键冲突异常 //Duplicate entry ‘4294967295’ for key ‘PRIMARY’

  • 可以将int改为bigint,修改时借助第3方工具或主从切换等
  • 其实一旦自增主键用完了,说明此时数据量已经很大(近20亿)!早就分库分表了,而分库分表了就不再使用自增ID

mysql索引结构

FULLTEXT
即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。

HASH
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。
HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

B-TREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

R-TREE
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找。

InnoDB索引实现

  • 主键索引(聚簇索引) :每个InnoDB表都有一个聚簇索引 ,聚簇索引使用B+树构建,叶子节点存储的数据是整行记录。一般情况下,聚簇索引等同于主键索引,当一个表没有创建主键索引时,InnoDB会自动创建一个ROWID字段来构建聚簇索引。

1.在表上定义主键PRIMARY KEY,InnoDB将主键索引用作聚簇索引。
2.如果表没有定义主键,InnoDB会选择第一个不为NULL的唯一索引列用作聚簇索引。
3.如果以上两个都没有,InnoDB 会使用一个6 字节长整型的隐式字段 ROWID字段构建聚簇索引。该ROWID字段会在插入新行时自动递增。

  • 辅助索引 :除聚簇索引之外的所有索引都称为辅助索引,InnoDB的辅助索引只会存储主键值而非磁盘地址。


主键索引的叶子节点会存储数据行,辅助索引只会存储主键值。

底层叶子节点的按照(age,id)的顺序排序,先按照age列从小到大排序,age列相同时按照id列从小到大排序。
使用辅助索引需要检索两遍索引:首先检索辅助索引获得主键,然后使用主键到主索引中检索获得记录。

组合索引 (最左前缀原则)

覆盖索引 :覆盖索引并不是说是索引结构,覆盖索引是一种很常用的优化手段。因为在使用辅助索引的时候,我们只可以拿到主键值,相当于获取数据还需要再根据主键查询主键索引再获取到数据。但是有这么一种情况,在组合索引查询时,如果需要查询的字段都被索引覆盖,那是不是意味着我们查询到组合索引的叶子节点就可以直接返回了,而不需要回表。这种情况就是覆盖索引。

覆盖索引 回表 索引下推

  • 覆盖索引:查询的字段都被索引覆盖,可直接在索引中查询而不用回表

  • 回表:二级索引无法直接查询到所有列的数据,所以通过二级索引查询到主键id后,再去遍历聚集索引。

    • 二级索引直接查询主键id,是顺序IO
    • 拿到主键id之后,这些主键id可能并不是顺序排列的,还要用主键去查询聚簇索引,是随机IO
  • 索引下推ICP:Mysql5.6推出,用于优化部分生效的非聚簇索引参考。可以减少回表次数及数据传输量,优化性能。

    不使用ICP时,存储引擎将通过索引搜索数据,然后返回数据给MySQL服务器,由MySQL服务器再判断是否符合条件。

    使用ICP时,MySQL服务器将把索引列的判断条件传递给存储引擎,由存储引擎判断是否符合条件,然后返回数据给MySQL服务器

最左前缀原则

  • 定义:顾名思义就是最左优先,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)为止。

比如a = 1 and b = 2 and c > 3 and d = 4
如果建立(a,b,c,d)顺序的索引,c为范围查询停止匹配,abc用到索引,d用不到索引

  • 原理:b+ 树按索引建立的顺序从左到右建立搜索树。

如(a,b,c,d)索引,b+ 树会优先比较 a 来确定下一步的所搜方向,如果 a 相同再依次比较 b 和 c ,最后得到检索的数据。反之……

  • 使用:在创建组合索引时,要根据业务需求,把where子句中使用最频繁的一列放在最左边;

=和in可以乱序,mysql的优化器帮助优化成索引可以识别的形式:如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序

全文索引

待整理

哈希索引

利用哈希函数h,根据关键字k计算出槽的位置。InnoDB中采用除法散列函数,冲突机制采用拉链法。

B+树相对Hash的区别 / 优劣 / 为什么不用hashmap

在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度,而不需要使用hash索引。

  • hash索引查询不稳定。hash索引虽然在等值查询上较快,但当某个键值存在大量重复的时候,hash冲突次数多,效率差;B+树所有的查询都是从根节点到叶子节点
  • hash索引不支持顺序查询。hash函数使得hash索引的顺序与原顺序无法保持一致
  • hash索引不支持范围查询
  • hash索引不支持模糊查询及最左匹配原则
  • hash索引不支持覆盖索引,避免不了回表查询

索引设计原则

  • 最左前缀原则
  • 不要过度索引
  • 尽量扩展而不要新建索引
  • 查询频繁的字段适合创建索引
  • 更新频繁的字段不适合创建索引
  • 区分度低的字段不适合加索引
  • 越小的数据类型通常更好。越小的数据类型通常在磁盘、内存和CPU缓存中需要更少的空间,处理起来更快。
  • 简单的数据类型更好。整型数据比字符的处理开销更小,因为字符的比较更复杂;应用内置的日期和时间数据类型,而不是用字符串来存储时间;用整型数据类型存储IP地址。
  • 应指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;

索引失效

索引哪些情况会失效 参考

理论+实际,给出sql语句要能判断出具体的情况!

  • 最左前缀原则,如对(a,b,c)

    • where b = XX and c = XX and a = XX 优化器优化,全部生效,但性能会差些
    • where d = XX and b = XX 优化器优化,b 生效,但性能会差些
    • where b = XX and c = XX 全部失效
  • 后面失效

    • 索引列使用like通配符,没有以%开头。解决方法:覆盖索引
    • 索引列使用运算> < != not in
  • 全部失效

    • 索引列进行计算、函数、自动或手动的类型转换(如字符串且在where中没有用引号括起来)
    • 索引列使用or。解决方法:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

索引列使用 is null、is not null 未知

百万级数据如何删除

删除数据库百万级别时,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。

  • 先删除索引(大概三分多钟)
  • 然后删除其中无用数据(不到两分钟)
  • 删除完成后重新创建索引(此时数据较少了创建索引也非常快,约十分钟左右)

列值为NULL时,是否会用到索引?

列值为NULL也是可以走索引的

在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;

参考

  • https://blog.csdn.net/qq_22238021/article/details/80918070
  • https://blog.csdn.net/qq_43332570/article/details/106901688
  • https://blog.csdn.net/u013308490/article/details/83001060
  • https://aflyun.blog.csdn.net/article/details/81102957
  • https://blog.csdn.net/qq_35190492/article/details/109257302
  • https://blog.csdn.net/wangfeijiu/article/details/113409719
  • https://blog.csdn.net/qq_41191715/article/details/106930205
  • https://blog.csdn.net/b_x_p/article/details/86434387
  • https://zhuanlan.zhihu.com/p/86137284
  • https://blog.csdn.net/LJFPHP/article/details/97133701
  • https://www.cnblogs.com/Chenjiabing/p/12600926.html
  • http://blog.codinglabs.org/articles/theory-of-mysql-index.html

MySQL索引知识点学习相关推荐

  1. MySQL索引知识点

    MySQL索引知识点 目录 B+ Tree 原理 MySQL 索引 索引优化 索引的优点 索引的使用条件 1. B+ Tree 原理 1. 数据结构 B+ Tree 指的是 Balance Tree, ...

  2. MYSQL索引结构学习笔记

    mysql 的数据.索引.DDL 等数据,都是以文件形式存储的, 所以导致每次查询都是一次I/O操作,当I/O操作过大时,会严重影响效率 MYSQL索引结构: mysql使用的是B+树来存储索引的,为 ...

  3. 腾讯 WXG 后台开发工程师对 MySQL 索引知识点总结

    知其然知其所以然!本文介绍索引的数据结构.查找算法.常见的索引概念和索引失效场景. 什么是索引? 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中 ...

  4. mysql qbe_掌握这13个MySQL索引知识点,让你面试通过率翻倍

    数据库索引有关的知识,说实在的,真的是很复杂,本来想好好看看这方面的东西,然后写篇文章详细谈谈的,后来发现索引的知识太难太深,要谈得全面又详细真的很难,所以最后还是把自己学到的和想到的变成下面一个个的 ...

  5. MySQL 索引知识点总结

    知其然知其所以然!本文介绍索引的数据结构.查找算法.常见的索引概念和索引失效场景. 什么是索引? 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中 ...

  6. mysql索引实例_mysql索引之十:Mysql 索引案例学习

    理解索引最好的办法是结合示例,所以这里准备了一个索引的案例. 假设要设计一个在线约会网站,用户信息表有很多列,包裹国家,地区,城市,性别,眼睛颜色,等等.完整必须支持上面这些特征的各种组合来搜索用户, ...

  7. Mysql 索引案例学习

    理解索引最好的办法是结合示例,所以这里准备了一个索引的案例. 假设要设计一个在线约会网站,用户信息表有很多列,包裹国家,地区,城市,性别,眼睛颜色,等等.完整必须支持上面这些特征的各种组合来搜索用户, ...

  8. MySQL索引的学习和研究

    为什么80%的码农都做不了架构师?>>>    这里所谈论只针对B-Tree类型索引,也是MySQL用的最多最普通的索引.创建索引的时候是按照字面量的顺序创建的,这个要特别注意.在B ...

  9. mysql索引linke和等于_MySQL索引的学习

    MySQL索引的学习 关于使用mysql索引的好处,合理的设计并使用mysql索引能够有效地提高查询效率.对于没有索引的表,单表查询可能几十万数据就是平静,在大型网站单日可能会产生几十万甚至几百万的数 ...

最新文章

  1. 僵尸网络病毒之BotNet扫盲、预防及清除
  2. EBB-11、Linux启动流程
  3. Ajax PHP 边学边练 之三 数据库
  4. 最新曝光的iPhone大漏洞:传文件会泄露个人隐私,2年多了苹果知而不改
  5. 集合 Arrays.asList | java.lang.UnsupportedOperationException: null
  6. 向朋友借钱:文章值得一读,让人思索良久
  7. linux文件内容添加序号,nl命令将指定的各个文件添加行号编号序号标注后写到标准输出...
  8. java中catch ()_有关java中的try{}catch(){}的讲解
  9. 高中上计算机专业用买电脑吗,大一新生有必要买电脑吗
  10. SQL从入门到入魔之初入门
  11. [2019杭电多校第四场][hdu6621]K-th Closest Distance(主席树)
  12. 评微软裁员测试:自动化测试并不能代替人工
  13. 382.链表随机节点
  14. 教你定时爬取微博热搜榜并做动态数据展示,让你不错过任何一个吃瓜热点
  15. ad导出元件清单_如何Altium Designer 中输出元件清单(BOM表格)
  16. 复习IO流复制文件时,文件损坏并且文件变得超大(FileInputStream和FileOutputStream)数组复制
  17. HTML和CSS的知识点总结
  18. Android 4.2 Wifi Display核心分析 (一)
  19. 2021年前端岗位面试题 “三”(本人亲测)
  20. 彻底卸载Google Chrome 谷歌浏览器的两种方法.绝对有效

热门文章

  1. hud抬头显示器哪个好_一台车萝卜抬头显示器=安全驾驶+智能语音导航+社交利器...
  2. vue项目安装/使用font-awesome字体图标库
  3. 未来教育c语言加载不出来图片,win10系统网页图片加载不出来的六种原因及解决方法[多图]...
  4. python两个循环同时运行,如何同时运行两个Python循环?
  5. 纯CSS 撩妹3D旋转相册
  6. OpenGL学习之路
  7. 【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)
  8. 分页和分段存储管理方式例题
  9. yum出现Could not retrieve mirrorlist解决方法
  10. python爬取快手评论信息+快手号