美文网首页
Mysql--单表访问方法

Mysql--单表访问方法

作者: 简书徐小耳 | 来源:发表于2019-05-12 22:20 被阅读0次

具体细节 请去掘金购买《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索引合并

相关文章

  • Mysql--单表访问方法

    具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》 访问方法(access method...

  • 单表的访问方法

    MySQL Server 在对一条查询语句进行语法解析之后,就会将其交给优化器来优化 先建立一个表: const ...

  • Java进阶-MySQL-进阶

    一、Java进阶-MySQL-进阶 1.1 单表访问方法   MySQL执行查询语句的方式称之为访问方法或者访问类...

  • 85-实战-单表访问方法

    一、数据准备 1.1、创建数据库 1.2、创建数据 设置MySQL可以创建 函数 创建随机字符串 函数 创建随机数...

  • 分库分表

    背景情况 用的MYSQL--单表号称7500w数据不可能真真正正的存在一张表里,这样我们使用起来性能非常的糟糕。这...

  • Oracle优化器基础知识之访问数据的方法(一)

    @[toc] 一、访问数据的方法 Oracle访问表中数据的方法有两种,一种是直接表中访问数据,另外一种是先访问索...

  • MongoDB限制访问单表

    如果对你有帮助, 请点击?喜欢?鼓励一下我这个臭弟弟 需求由来 和其他公司对接, 需要访问特定的数据, 提供视图对...

  • 哪些情况会引起/要求全表扫描?

    一. 何时适用全表扫描(正面) 单表查询表很小,索引可能就比表还大;访问的数据占全表数据的百分比很大,索引访问的总...

  • lua metatable __nexindex方法

    __index元方法是访问,如果表中没有就会进元方法查找(如果有元表的话),如果元方法是表,返回元表的元素;如果元...

  • 分库分表

    数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。 分库分表目前有很多的中间...

网友评论

      本文标题:Mysql--单表访问方法

      本文链接:https://www.haomeiwen.com/subject/rgmaoqtx.html