单表访问方法

对于我们这些MySQL使用者来说,MySQL其实就是一个软件,平时用的最多的就是查询功能.DBA是不是丢过来一些慢查询语句让优化,如果我们连查询的原理都不知道,就很难进行优化了。
MySQL Server有一个称为查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。
本文主要关注的是MySQL怎么执行单表查询:
先建立个表:

CREATE TABLE single_table (
    id INT NOT NULL AUTO_INCREMENT,
    key1 VARCHAR(100),
    key2 INT,
    key3 VARCHAR(100),
    key_part1 VARCHAR(100),
    key_part2 VARCHAR(100),
    key_part3 VARCHAR(100),
    common_field VARCHAR(100),
    PRIMARY KEY (id),
    KEY idx_key1 (key1),
    UNIQUE KEY idx_key2 (key2),
    KEY idx_key3 (key3),
    KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;

我们为这个single_table表建立了1个聚簇索引和4个二级索引:

  • 为id列建立的聚簇索引
  • 为key1列建立的idx_key1二级索引
  • 为key2列建立的二级索引,而且该二级索引是唯一二级索引
  • 为key3列建立的idx_key3二级索引
  • 为key_part1、key_part2、key_part3列建立的idx_key_part二级索引,这也是一个联合索引

访问方法的概念(access method)

MySQl查询的执行方式大致有以下两种:

  • 使用全表扫描进行查询:这个很好理解,把表的每一行记录都扫描一遍,把符合搜索条件的记录加入结果集就可以了,不管是什么查询都可以用这种方式来执行。
  • 使用索引进行查询:由于全表扫描需要扫描的记录太多,代价太大,如果查询语句的搜索条件可以用到某个索引,那么直接使用索引来执行查询可能可以加快查询执行的时间,使用索引来执行查询的方式又有很多种:
    1.针对主键或唯一二级索引的等值查询
    2.针对普通二级索引的等值查询
    3.针对索引列的范围查询
    4.直接扫描整个索引

MySQL执行查询语句的方式叫做访问方法或者访问类型。同一个查询语句可能可以使用多种不同的访问方法来执行,虽然最后的查询结果是一样的,但是执行的时间可能天差地别。

const

有的时候我们可以通过主键列来定位一条记录:

SELECT * FROM single_table WHERE id = 1438;

MySQL会直接利用主键值在聚簇索引中定位对应的用户记录:
在这里插入图片描述
对于single_table表的聚簇索引来说,展现的就是id列。我们想突出的重点是:B+树叶子节点中的记录是按照索引列排序的,对于的聚簇索引来说,它对应的B+树叶子节点中的记录就是按照id列排序的。B+树本来就是一个矮矮的大胖子,所以这样根据主键值定位一条记录的速度很快。
类似的,我们根据唯一二级索引列来定位一条记录的速度也是很快的:

SELECT * FROM single_table WHERE key2 = 3841;

在这里插入图片描述
可以看到这个查询的执行分为两步,第一步先从idx_key2对应的B+树索引中根据key2列与常数的等值比较条件定位到一条二级记录,然后再根据该记录的id的值到聚簇索引中获取到完整的用户记录。

设计者认为通过主键或者一二级索引列与常数的等职比较来定位一条记录是像坐火箭一样快的,所以他们把这种通过主键或者一二级索引列来定位一条记录的访问方法定义为:const,意思是常数级别的。
不过这种const访问方法只能在主键列或者唯一二级索引列和一个常数进行等值比较时才有效,如果主键或者唯一二级索引是由多个列构成的话,索引中的每一个列都需要与常数进行等值比较,这个const访问方法才有效。
对于唯一二级索引来说,查询该列为NULL值的情况比较特殊:

SELECT * FROM single_table WHERE key2 IS NULL

因为唯一二级索引列并不限制NULL值的数量,所以上述语句可能访问到多条记录,也就是说这个语句不可以使用const访问方法来执行。

ref

有时候我们对某个普通的二级索引列与常数进行等值比较:

SELECT * FROM single_table WHERE key1 = 'abc'

对于这个查询,我们当然可以全盘扫描(这个大概是通用的方法),也可以先使用二级索引找到对应记录的id值,然后再回表到聚簇索引中查找完整的用户记录。由于普通二级索引并不限制索引列值的唯一性,所以可能找到多条对应的记录,也就是说使用二级索引来执行查询的代价取决于等值匹配到的二级索引记录的条数。如果匹配的记录较少,那么回表的代价还是很低的,在极限情况下,如果只有一个回表,那么就和const一样了。
因此MySQL可能选择使用索引而不是全表扫描的方式来执行查询。
设计者把这种搜索条件为二级索引列与常数等值比较,采用二级索引来执行查询的访问方法称为ref。
查询图示如下:
在这里插入图片描述
对于普通的二级索引来说,通过索引列进行等值比较后可能匹配到多条连续的记录,而不是像主键或者唯一二级索引中只能匹配到一条记录,所以这种ref访问方法比const差了那么一点点,但是在二级索引等值比较时匹配的记录数较少的时候记录也是很高的,如果匹配的二级索引数量太多,那么回表的成本会变得很大。

  • 二级索引列值为NULL的情况:无论是普通的二级索引还是唯一二级索引,都对NULL的数量并不限制,因此我们采用Key is NULL这种形式的搜索条件最多只能使用ref的访问方法,而不是const的访问方法。
  • 对于某个包含多个索引列的二级索引来说,只要是最左边的连续索引列是与常数的等值比较就可能采用ref的访问方法:
SELECT * FROM single_table WHERE key_part1 =  'god like';
SELECT * FROM single_table WHERE key_part1 =  'god like'; AND key_part2 ='legendary'
SELECT * FROM single_table WHERE key_part1 =  'god like'; AND key_part2 ='legendary' AND key_part3 = 'penta kill'

但是如果最左边的连续索引列并不是全部是等值比较的话,它的访问方法就不能称ref了,比如说这样:

SELECT * FROM single_table WHERE key_part1 = 'god like' AND key_part2 > 'legendary';

ref_or_null

有时候我们不仅想找出某个二级索引列的值等于某个常数的情况,还想把该列的值为NULL的记录也找出来,就像下面这个查询:

SELECT * FROM single_table WHERE key1 = 'abc' OR key1 IS NULL;

当使用二级索引而不是全表扫描的方式执行该查询的时候,这种类型的查询使用的访问方法就成为ref_or_null,执行过程如下:
在这里插入图片描述
可以看到,上边的查询相当于先分别从idx_key1索引对应的B+树种找出key1 IS NULL和key1 = ‘abc’的两个连续的范围记录,然后根据这些二级索引记录中的id值再回表查找完整的用户记录。

range

我们之前介绍的几种访问方法都是在对索引列与某一个常数进行等值比较的时候才可能使用到(ref_or_null比较奇特,还计算了值为NULL的情况)但是有些时候我们面对的搜索条件更加复杂:

SELECT * FROM single_table WHERE key2 IN (1438,6328) OR (key2 >= 38 AND key2 <=79);

我们当然还可以全盘扫描啦,不过也可以使用二级索引+回表的方式执行,那么此时的搜索条件就不只是要求索引列与常数的等值匹配了,而是索引列需要匹配某个或者某些范围的值,在以上这个查询中,key2列的值只要匹配下列3个范围中的任何一个就可以了:

  • key2的值是1438
  • key2的值是6328
  • key2的值在38到79之间
    设计者把这种利用索引进行范围匹配的访问方法称为:range
    如果把这几个所谓的key2列的值需要满足的范围在数轴上体现出来的话:
    在这里插入图片描述也就是从数学的角度看,每一个所谓的范围都是数轴上的一个区间,3个范围也就对应三个区间。
    我们可以把那种索引值列等值匹配的情况称之为单点区间,上面所说的范围1和范围2都可以被称为单点区间,像范围3这种的我们可以称之为连续范围区间。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Excel中,要导出访问方法415,可以按照以下步骤操作: 1. 打开Excel软件,并打开包含要导出的数据的工作表。 2. 在要导出的数据旁边插入一列或一行,用于添加导出访问方法415的公式。 3. 在插入的列或行中选择一个空单元格,输入以下公式:=HYPERLINK("访问方法415", "导出访问方法415")。 这个公式中,访问方法415是导出文件的路径或网页链接,可以根据具体需求进行设置。 4. 按下回车键,Excel会将公式解释为一个超链接,并显示为“导出访问方法415”的文本。 5. 单击该超链接,Excel会自动打开访问方法415所指向的文件或网页。 这样,当其他人阅读这个Excel文件时,只需单击“导出访问方法415”的文本,就可以方便地访问相关文件或网页了。 需要注意的是,如果要导出的文件是本地计算机上的文件,路径应该是完整的文件路径,包括文件所在的磁盘、文件夹和文件名。如果要导出的是网页链接,应该确保链接是正确的并且可以在当前网络环境下访问。 ### 回答2: 当出现Excel导出时,HTTP状态码415通常表示服务器无法处理请求中所包含的媒体类型。 在Excel导出过程中,媒体类型是指使用的数据格式。服务器在接收到请求后,会根据请求的头部信息判断请求中所包含的媒体类型,然后选择相应的处理方法。然而,如果服务器无法支持或处理请求中的媒体类型,就会返回415状态码,表示不支持此格式的导出。 要解决这个问题,可以考虑以下几个方面: 1. 检查服务器端的支持:确保服务器端支持要导出的Excel格式。如果服务器无法处理特定的媒体类型,可能需要对服务器进行升级或配置相关的插件。 2. 检查请求头部信息:确认请求中的Content-Type头部信息是否正确。Content-Type字段指定了请求的媒体类型,如果此字段内容与实际的媒体类型不匹配,服务器可能会返回415状态码。 3. 检查请求数据格式:检查将要导出为Excel的数据格式是否符合服务器要求。可能需要进行数据转换或者格式调整,确保数据能够正确地导出为Excel文件。 4. 联系服务器管理员或开发人员:如果以上方法都没有解决问题,可以咨询服务器管理员或开发人员,他们可能会提供更详细的解决方案。 总之,要解决Excel导出中的415错误,需要确保服务器支持所需的媒体类型,并且请求中的数据格式、头部信息和服务器要求相匹配。 ### 回答3: 在Excel中,如果遇到"导出访问方法415"的问题,通常是因为在使用VBA代码或宏时出现了错误。这个错误代码表示服务器无法处理包含在请求中的内容类型。 要解决这个问题,可以尝试以下几种方法: 1. 检查代码:首先,请检查你的VBA代码或宏是否正确。可能有语法错误或逻辑问题导致请求格式不正确。请确保所有的语法和逻辑正确,特别是与导出访问方法415相关的部分。 2. 检查服务器设置:如果你使用的是服务器,在执行导出操作之前,请检查服务器的相关设置。确保服务器支持所需的内容类型和编码。有时,服务器的设置可能会限制或阻止特定的导出操作。 3. 检查文件格式:在导出操作之前,请检查你要导出的文件的格式。确保文件的格式与请求的内容类型一致。例如,如果你要导出为CSV格式,确保内容类型设置为"application/csv"。 4. 更新Excel版本:如果你使用的是较旧版本的Excel,则可能会遇到此问题。尝试更新到最新的Excel版本,并确保安装了所有可用的更新和修复程序。 5. 参考官方文档:如果以上方法都没有解决问题,可以参考Excel官方文档或搜索在线社区,查找与导出访问方法415相关的更多解决方法。有时,能在社区中找到与你遇到的具体情况相似的问题,并获得有效解决方案。 总之,要解决"导出访问方法415"的问题,需要检查代码、服务器设置、文件格式,并尝试更新Excel版本。如果问题仍然存在,可以参考官方文档或在线社区寻找更多解决方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SCU Polars

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值