深入理解MySQL中的范围访问方法:单索引与多索引优化策略

深入理解MySQL中的范围访问方法:单索引与多索引优化策略

范围查询方法是数据库查询优化的一种重要手段,它通过利用索引来减少需要检查的数据行数,从而提高查询的执行效率。

范围查询使用单个索引来检索表中包含在一个或多个索引值区间内的子集。它可以用于单索引或多索引。本文会对优化器使用范围访问的条件进行详细介绍。

单索引

针对单索引查询,我们可以通过WHERE子句中的条件来定义索引值区间,这些条件被称为范围条件。范围条件可以是等于(=)、不等于(!=<>)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、BETWEENIN()LIKE(当LIKE的参数是不以通配符开头的常量字符串时)、IS NULLIS NOT NULL等比较操作。

对于BTREE索引,以上所有比较操作都能定义范围条件,而对于HASH索引,只有等于、IS NULLIS NOT NULL操作能定义范围条件。

考虑以下查询语句,其中key1是一个索引列,而nonkey不是索引列:

SELECT * FROM t1 WHERE(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR(key1 < 'bar' AND nonkey = 4) OR(key1 < 'uux' AND key1 > 'z');

提取过程首先移除不能用于范围扫描的nonkey = 4key1 LIKE '%b'条件,因为它们不符合范围条件的定义。然后,通过合并和简化条件,最终确定用于范围扫描的条件。

上述过程的结果是(key1 < 'bar'),这是一个比原始WHERE子句更宽松的条件。MySQL将使用这个条件进行范围扫描,然后再执行额外的检查,以过滤出满足范围条件但不满足完整WHERE子句的行。

优化建议

  • 使用BTREE索引:对于需要执行范围查询的列,使用BTREE索引通常比HASH索引更有优势,因为它支持更多类型的范围查询。
  • 精确定义范围条件:通过精确定义WHERE子句中的范围条件,可以帮助MySQL优化器更有效地利用索引进行查询。
  • 避免使用通配符开头的LIKE操作:当需要使用LIKE进行模糊匹配时,尽量避免参数以通配符开头,因为这会阻止优化器使用范围访问方法。

多索引

多索引的范围条件通过在WHERE子句中使用特定条件来限制索引行,使其位于一个或多个数据区间内。这些数据区间根据索引的排序来定义。

例如,设想一个定义为key1(key_part1, key_part2, key_part3)的多索引,以下是按键顺序列出的一组数据:

key_part1  key_part2  key_part3NULL       1          'abc'NULL       1          'xyz'NULL       2          'foo'1         1          'abc'1         1          'xyz'1         2          'abc'2         1          'aaa'

条件key_part1 = 1定义了以下区间:

(1,-inf,-inf) <= (key_part1,key_part2,key_part3) < (1,+inf,+inf)

该区间覆盖了上述数据集中的第4、5、6条数据,可以被范围访问方法使用。

对于HASH索引

每个包含相同值的区间都可以被使用。这意味着区间只能为以下形式的条件生成:

    key_part1 cmp const1 
AND key_part2 cmp const2 
AND ... 
AND key_partN cmp constN;

这里,const1const2等是常数,cmp=, <=>, 或IS NULL比较运算符,且条件覆盖了所有索引部分。

对于BTREE索引

条件与AND组合时,如果每个条件使用=, <=>, IS NULL, >, <, >=, <=, !=, <>, BETWEEN, 或LIKE 'pattern'(其中’pattern’不以通配符开头)将键部分与常量值进行比较,那么一个区间可能是可用的。

如果比较运算符是=, <=>, 或IS NULL,优化器尝试使用额外的键部分来确定区间。
如果运算符是>, <, >=, <=, !=, <>, BETWEEN, 或LIKE,优化器将使用它但不考虑更多键部分。

范围条件的优化实践

当使用OR组合覆盖区间内行集的条件时,它们形成了一个覆盖它们区间并集内行集的条件。如果条件与AND组合,则形成一个覆盖它们区间交集内行集的条件。

例如,对于一个两部分索引的条件:

(key_part1 = 1 AND key_part2 < 2) OR (key_part1 > 5)

区间为:

(1,-inf) < (key_part1,key_part2) < (1,2)
(5,-inf) < (key_part1,key_part2)

参考链接

https://dev.mysql.com/doc/refman/8.0/en/range-optimization.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 多色正方形上升

<template><view class="loop cubes"><view class="item cubes"></view> <!-- 方块1 --><view class="item cubes"></view> <!-- 方块2 --><view class="item cubes"></vie…

896.单调数列(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 如果数组是单调递增或单调递减的&#xff0c;那么它是 单调 的。 如果对于所有 i < j&#xff0c;nums[i] < nums[j]&#xff0c;那么数组 nums 是单调递增的。 如…

day23 其他事件(页面加载事件、页面滚动事件)

目录 页面加载事件页面/元素滚动事件页面滚动事件——获取位置 页面加载事件 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件为什么使用&#xff1a; 有时候需要等页面资源全部处理完毕再做一些事老代码喜欢把script写在head中&…

Midjourney图片生成描述词记录(今天一天)

抄别人的描述词 /imagine prompt:https://&#xff08;你的图片地址&#xff09;.jpg Super handsome boy IP by pop mart , green suit, no hair, bald head, Scenes in spring , pastel color , mockup , fine luster , clean background ,3D render , Soft focus , oc , bl…

NodeJS Express在线人数统计

NodeJS开发中&#xff0c;要在Express中实现一个在线人数统计系统&#xff0c;可以用下面的思路&#xff1a; 数据结构: 使用一个对象来存储每个 IP 地址的最后访问时间。 当有请求到来时: 1、检查该 IP 地址是否已存在于对象中。 2、如果存在&#xff0c;更新其访问时间。…

20.2K Star,一个简洁美观、易用的云盘系统

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 现在的网盘动不动就限速&#xff0c;涨价&#xff0c;非常不爽&#x…

如何“做好冲突管理”?

一、工作实际案例 产品经理在主导跨部门需求项目时&#xff0c;项目在验收阶段&#xff0c;产品经理与业务人员完成初步验收&#xff0c;接下来需要开发同学解决验收问题。 开发小组长反馈&#xff1a;经开发内部评估&#xff0c;按当前项目排期&#xff0c;因上线时间紧张&a…

linux如下显示目录和子目录的树形结构

目 录 一、需求 二、解决方法 三、tree工具的安装 1. centos中安装tree 2&#xff0c;在Ubuntu系统中安装tree 3&#xff0c;使用源码编译安装 四、tree的语法 1、语法 2、常用选项 一、需求 应用程序的目录中包含一些子目录&#xff0c;目录嵌套很多&am…

10个必学的Python编程小技巧

10个必学的Python编程小技巧 一、列表推导式&#xff08;List Comprehension&#xff09;二、生成器表达式&#xff08;Generator Expression&#xff09;三、使用enumerate()遍历列表四、使用zip()同时遍历两个列表五、使用setattr()和getattr()动态操作对象属性六、使用with语…

数据监控-Prometheus/Grafana

一、数据监控Prometheus 1、什么是Prometheus Prometheus是由SoundCloud开源监控告警解决方案,从2012年开始编写代码,到2015年github上开源以来,吸引不少用户以及公司的使用。Prometheus作为新一代的开源解决方案,很多理念与Google SRE的运维之道不谋而合。 2、Promet…

【大厂AI课学习笔记】1.1.1人工智能导论

这个系列&#xff0c;之前是百度的学习笔记&#xff0c;后来他们网站打不开了&#xff0c;现在换为另一个大厂的。 第一节 人工智能导论 1.1 人工智能导论 1.1.1 人工智能概念的诞生 AI&#xff0c;Artificial Intelligence 1956年&#xff0c;美国达特茅斯会议提出。 定义…

2024/1/28 备战蓝桥杯 1-3

目录 特殊日期 0特殊日期 - 蓝桥云课 (lanqiao.cn) 最大距离 0最大距离 - 蓝桥云课 (lanqiao.cn) 最长递增 0最长递增 - 蓝桥云课 (lanqiao.cn) 缩位求和 0缩位求和 - 蓝桥云课 (lanqiao.cn) ISBN号码 0ISBN号码 - 蓝桥云课 (lanqiao.cn) 串的处理 0串的处理 - 蓝桥…

讯飞大模型定制训练平台尝鲜

文章目录 前言进入平台功能探索余额数据集管理 先训为快讯飞星火3.0Chinese-Aplaca-2-7BLlama2-7BInternLM-7BBloomz-7Bfalcon-7BBloomz-3B 前言 众所周知&#xff0c;国产大模型如千问、书生、易等等都有开源大模型&#xff0c;但是出场时效果就很不错的讯飞星火大模型却迟迟…

OpenHarmony关系型数据库

1 概述 关系型数据库(Relational Database, 以下简称RDB)是一种基于关系模型来管理数据的数据库&#xff0c;是在SQLite基础上提供一套完整的对本地数据库进行管理的机制&#xff0c;为开发者提供无需编写原生SQL语句即可实现数据增、删、改、查等接口&#xff0c;同时开发者也…

通讯录小项目(上)

Start And Stick 通讯录的实现有很多种方式&#xff0c;今天我们将用结构体实现简单的通讯录项目功能。包括通讯录的增、删、查、改等功能。 思路&#xff1a; 此次代码文件分别为&#xff1a; 文件名用途sqlist.h用于函数和结构体的声明sqlist.c用于函数的实现test.c用于通讯…

DevOps系列文章之 Git命令:过滤日志

使用git log命令查找特定提交历史的高级技巧。其中的一些技巧配合格式化日志命令使用有奇效。 按照数量过滤 使用git log命令时最基本的过滤方式就是按照可以显示的日志条数进行过滤。如果你只对最近几次提交感兴趣&#xff0c;这会节省在页面上查看所有提交的麻烦。 git lo…

Vue3在css中使用v-bind绑定js/ts变量,也可以在scss和less中使用方式

主要介绍Vue3中的新增的v-bind()的常用使用方式&#xff0c;主要包括在css,less,scss中的使用&#xff0c;可以参考官方文档查看&#xff1a;Vue3官方文档 特别提醒 如果你想在scss中或者less中使用&#xff0c;可能会报各种乱七八糟的错误&#xff0c;最快最好用的方式就是单…

RBD —— 不同材质破碎

目录 Working with concrete Chipping Details Proxy geometry Constraints Working with glass Chipping Proxy geometry Constraints Resolving issues with glass fracturing Working with wood Clustering Using custom cutters Working with concrete Concr…

【PostgreSQL OpenGauss 】数据库查询表锁,释放表锁

PostgreSQL & OpenGauss 数据库查询表锁&#xff0c;释放表锁 PostgreSQLOpenGauss 在数据库中&#xff0c;表锁是用于控制对表的并发访问的一种机制。不同的数据库系统&#xff08;如 PostgreSQL 和 OpenGauss&#xff09;可能具有不同的表锁管理机制。下面分别介绍如何在…

【RT-DETR有效改进】EfficientFormerV2移动设备优化的视觉网络(附对比试验效果图)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…