[每天进步一点点]mysql笔记整理(三):索引

笔记很无味,点赞请准备。

image

索引定义

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中的数据。

从定义中可以看出,索引其实就是一种数据结构。数据都是以文件的形式存储在磁盘上的,每一行数据都有它的磁盘地址,如果没有索引,要从几百万行数据中检索一条数据,只能遍历整张表才能找过结果。有了索引之后,只需要在索引里面去检索这条数据就可以了,因为索引是一种特殊的专门用来快速检索的数据结构,当我们找到数据磁盘地址后,就可以拿到想要的数据。

索引类型

以InnoDB存储引擎为例,索引类型有:

  1. Normal(普通索引)

    也叫非唯一索引,是最普通的索引,没有任何限制条件。

  2. Unique(唯一索引)

    唯一索引要求键值不能重复。

    主键索引是一种特殊的唯一索引,它多了一个限制条件,要求键值不能为空。

  3. Fulltext(全文索引)

    全文索引主要是针对比较大的数据,比如我们存放的是消息内容,有几kb的数据,如果要解决like查询效率低的问题,可以创建全文索引。只有文本类型的字段才可以创建全文索引,比如char、varchar、text。

    全文索引的使用:

    select * from table where match(content) against ('xxxx' IN NATURAL LANGUAGE MODE);
    
  4. 聚集索引(聚簇索引)

    聚集索引就是索引键值的逻辑顺序跟表数据行的物理存储顺序是一致的。在InnoDB中,主键索引就是聚集索引,非主键索引是非聚集索引。

索引存储模型

索引的存储模型有二分查找、二叉查找树(BST Binary Search Tree)、平衡二叉树(AVL Tree)、多路平衡查找树(B Tree)、加强版多路平衡查找树(B+ Tree)。

存储模型是一步一步演进过来的。

InnoDB逻辑存储结构

image-20200402125920970

mysql的存储结构分为5级,表空间、段、簇、页、行。

  • 表空间

表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。表空间又分为:系统表空间、独占表空间、通用表空间、临时表空间、Undo表空间。

  • 段(Segment)

表空间是由各个段组成,段又分为:数据段、索引段、回滚段。

段是一个逻辑概念,一个ibd文件(独立的表空间文件)里面会有很多个段组成。

创建一个索引会创建两个段,一个是索引段(leaf node segment),一个是数据段(non-leaf node segment)。索引段管理非叶子节点的数据,数据段管理叶子节点数据。

  • 簇(Extent)

一个段又是由多个簇(也可以叫区)组成,每个簇的大小是1MB(64个连续的页)。

每一个段至少有个一个簇,一个段所管理的空间大小是无限的,可以一直扩展下去,扩展的最小单位就是簇。

  • 页(Page)

簇是由连续的页组成的空间,一个簇中有64个连续的页。

一个表空间最多拥有2^32个页,默认情况下一个页的大小为16KB,也就是说一个表空间最多存储64TB的数据。

  • 行(Row)

InnoDB存储引擎是面向行(Row-oriented)存储的。

索引使用原则

  1. 列的离散度

    列的离散度计算公式:count(distinct(column_name))/count(*),列的全部不同值和所有数据行的比例。数据行数相同的情况下,分子越大,列的离散度就越高。

    简单来说,如果列的重复值越多,离散度就越低,重复值越少,离散度就越高。

  2. 联合索引最左匹配

    联合索引在B+Tree中是复合的数据结构,它是按照从左到右的顺序来建立搜索树的。

我们在建立联合索引的时候,一定要把最常用的列放到最左边。

例如:给表table中建立联合索引a和b,

select * from table where a='xxx' and b='xxx' /*是可以用到联合索引的。*/

select * from table where a='xxx' /*可以用到联合索引*/

select * from table where b='xxx' /*无法使用联合索引*/

给a和b建立联合索引其实就是相当于(a)和(a,b)建立了两个索引。

在给a、b、c建立联合索引的时候其实就是建立了(a)索引,(a,b)索引,(a,b,c)索引,这时,如果条件where b=‘xxx‘和where b=‘xxx' and c='xxx',还有where a='xxx' and c='xxx'都是用不到联合索引的。

说明联合索引的使用条件时不能不使用第一个字段,也不能中断。

什么时候用不到索引

  1. 在索引列上使用函数(replace、substr、concat、sum、count、avg)、表达式、计算(+、-、、/*)。

  2. 字符串不加引号,出现隐式转换。

  3. like条件前面带%

  4. 负向查询

    not like 不能使用索引。

    !=、<>、not in在某些情况下可能用到索引。

    注意:一个sql语句是否使用到索引,是跟数据库版本,数据量、数据选择度都有关系的。

其实用不用到索引,最终都是由优化器说了算。

优化器是基于cost开销来决定的,怎么样开销小就怎么来。它不基于规则,也不基于语义。

覆盖索引

在辅助索引里面,不管是单列索引还是联合索引,如果select后的数据列只要从索引中就能够得到,不用在从数据区中读取,这时候使用的索引就叫覆盖索引,这样也避免了回表。

回表

非主键索引,是先通过索引找到主键索引的键值,在通过主键值查出索引里面没有的数据,它比基于主键索引查询的时候多了一次查询,这个过程就是回表。

索引下推

例如:给a和b建立索引。

  1. 先根据a列从存储引擎中把符合规则的数据拉取到mysql的server层。
  2. 在server层按照b进行数据过滤。

这个过程就叫索引下推

B+ Tree

image-20200402130100082

特点

  1. 它的关键字的数量是跟路数相等的。
  2. B+Tree的根据节点和枝节点都不会存储数据,只有叶子节点才存储数据。搜索到关键字不会直接返回,会到最后一层叶子节点。
  3. B+Tree的每个叶子节点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,这样就形成了一个有序链表的结构。
  4. 它是根据左闭右开的区间来检索数据的。

[每天进步一点点]mysql笔记整理(一)

[每天进步一点点]mysql笔记整理(二):事务与锁


  • 整理不易,转载请注明出处,喜欢的小伙伴可以关注公众号查看更多喜欢的文章。
  • 微信:ffj2000
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容