Mysql--单表访问方法

具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》

访问方法(access method)的概念

  • 1.MySQL执行查询语句的方式称之为访问方法或者访问类型

访问方法的类型

  • 1.我们可以通过explain 来判断一个语句执行的方式。
  • 2.const,ref,ref_or_null,range,index,all(查询速度越来越慢)

const(即确定肯定只有一条或者零条符合记录的数据)

  • 1.针对于主键或者唯一的二级索引都可以以这种方式访问。
  • 2.这种const访问方法只能在主键列或者唯一二级索引列和一个常数进行等值比较时才有效
  • 3.如果主键或者唯一二级索引是由多个列构成的话,索引中的每一个列都需要与常数进行等值比较,才可以走const
  • 4.因为唯一二级索引列并不限制 NULL 值的数量,所以不走const方法

ref

  • 1.使用普通二级索引采用等值来匹配会在匹配记录较少的情况下走ref
  • 2.如果匹配的记录太多则会变成全表扫描,因为回表代价太大(随机IO)
  • 3.整个流程是从二级索引得到一系列记录,然后将这些记录去主键索引中搜索。
  • 4.不论是普通的二级索引,还是唯一二级索引,它们的索引列对包含NULL值的数量并不限制,所以我们采用key IS NULL这种形式的搜索条件最多只能使用ref的访问方法,而不是const的访问方法。
  • 5.对于某个包含多个索引列的二级索引来说,只要是最左边的连续索引列是与常数的等值比较就可能采用ref的访问方法对于某个包含多个索引列的二级索引来说,只要是最左边的连续索引列是与常数的等值比较就可能采用ref的访问方法

ref_or_null

  • 1.找出某个二级索引列的值等于某个常数的记录,还想把该列的值为NULL的记录也找出来

range

  • 1.对于范围查询(in和大于小于这些),可以采用range,当然也可以采用全表扫描

index

  • 1.用遍历二级索引记录的执行方式称之为dex
  • 2.经典的方式就是对于联合索引,我们查询的列,联合索引就包含但是我们的where 条件不是最左列所以只能对联合索引进行遍历

all

  • 1.对主键索引的遍历

注意事项

重温 二级索引 + 回表

  • 1.如果where 会有两种方式走二级索引,优化器会根据统计数据来判断走哪种索引扫描的数据较小。
  • 2.例子:SELECT * FROM single_table WHERE key1 = 'abc' AND key2 > 1000;
  • 3.上述例子假如走key1索引然后得到符合条件的记录(记录的主键),然后回到主键索引
  • 4.根据在二级索引找到的记录找到完整记录再根据key2的条件筛选。

一般情况下where条件如果用到多个二级索引,只会使用其中一个,然后其他条件都是等到回表时候进行匹配

索引合并

Intersection(交集)合并

  • 1.虽然读取多个二级索引比读取一个二级索引消耗性能,但是读取二级索引的操作是顺序I/O,而回表操作是随机I/O
  • 2.二级索引列是等值匹配的情况,或者对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只匹配部分列的情况。
  • 3.主键是索引范围,二级索引是等值
  • 4.具体是否合并索引查询,还是看查询代价。
  • 5.之所以在二级索引列都是等值匹配的情况下才可能使用Intersection索引合并,是因为只有在这种情况下根据二级索引查询出的结果集是按照主键值排序的。
    排好序的两个集合取交集很快,如果未排好序的则需要一定时间才能匹配交集。

Union(并集)合并

  • 1.二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只出现匹配部分列的情况
  • 2.主键列可以是范围匹配
  • 3.使用Intersection索引合并的搜索条件
  • 4.具体是否合并索引查询,还是看查询代价。

Sort-Union合并

  • 1.我们把上述这种先按照二级索引记录的主键值进行排序,之后按照Union索引合并方式执行的方式称之为Sort-Union索引合并,
    很显然,这种Sort-Union索引合并比单纯的Union索引合并多了一步对二级索引记录的主键值排序的过程

索引合并注意事项

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

推荐阅读更多精彩内容

  • 这篇文章主要涉及到MySQL的知识点: 索引(包括分类及优化方式,失效条件,底层结构) sql语法(join,un...
    一根薯条阅读 2,700评论 0 8
  • 问题1:char、varchar的区别是什么?varchar是变长而char的长度是固定的。如果你的内容是固定大小...
    风的低语阅读 1,166评论 0 8
  • MySQL不权威总结 欢迎阅读 本文并非事无巨细的mysql学习资料,而是选择其中重要、困难、易错的部分进行系统地...
    liufxlucky365阅读 2,583评论 0 26
  • ​ 在工作中,经常会碰到一些慢查询,Explain可以帮我们更详细的了解MySQL查询的执行计划,用法也很简单...
    metmax阅读 2,618评论 0 3
  • 枫林谷 淡日轻烟翠欲流,山花野径鸟声幽。枫林谷内人陶醉,放纵情怀作快游。 飘如鸾鹤沓难寻,攀上山颠感不禁。遥见群峰...
    倚剑白云天阅读 398评论 1 1