简单谈谈MySQL的loose index scan

yizhihongxing

简单谈谈MySQL的loose index scan

MySQL支持多种类型的索引扫描方法,其中一种比较特殊的方法是loose index scan。来看看loose index scan是如何工作的。

什么是loose index scan

loose index scan是一种基于索引前缀的扫描方法。所谓索引前缀,指的是索引中前面一个或多个列的值,例如索引为(a,b,c)的表,其前缀可以是(a),(a,b)或(a,b,c)。套用loose index scan的思路,只需要在索引前缀上做扫描,不需要扫描整个索引。这种方法可以减少IO操作,提高查询效率。

如何启用loose index scan呢?

严格来说,MySQL并不需要我们手动启用loose index scan。当MySQL认为该方法比其他方法更优秀,并且可行的时候,就会自动选择loose index scan扫描索引。因此,要想启用这个方法,我们需要让MySQL认为它是最好的选择。

如何让MySQL认为loose index scan是最好的选择

让MySQL选择loose index scan的前提条件是:索引前缀是包含有足够的数据的子集。如果前缀所对应的数据不是很多,那么使用loose index scan就无法跳过大量的数据,此时使用一般的全索引扫描反而会更快。

那么,如何让索引前缀包含有足够的数据呢?

这个问题的答案是:更改查询列的顺序。

假设有以下的表和索引:

CREATE TABLE t (
  a INT NOT NULL,
  b INT NOT NULL,
  c INT NOT NULL,
  d INT NOT NULL,
  PRIMARY KEY (a,b,c,d),
  INDEX idx (c,b,a,d)
);

我们按照下面的顺序查询这张表:

SELECT * FROM t WHERE c=1 AND a=2 AND d>3 AND b>4;

按照顺序c->a->d->b,该查询适合使用loose index scan方法。因为此时,索引前缀idx(c,a,d)所对应的数据,几乎包括了整个查询结果。而如果我们按照其他顺序,很可能就无法利用loose index scan,需要扫描整个索引。

再看一个例子:

SELECT * FROM t WHERE a>1 AND c<9 AND b=3;

如果我们将索引字段的顺序改成(b,c,a),那么就可以使用loose index scan技术了。

总之,如果想要使用loose index scan方法,在设计索引和写查询语句时一定要注意顺序。

示例一

现在,我们做一个简单的对比实验,看看使用loose index scan的查询和一般的查询有什么不同。

-- 执行时间:100ms
SELECT * FROM t WHERE a=1 AND b=1 AND c=1 AND d=1;

-- 执行时间:80ms
SELECT * FROM t WHERE a=1 AND b=1 AND c=1 AND d BETWEEN 0 AND 100;

前者是一般的查询,后者是加入了BETWEEN的查询。两者的查询结果可能相同,但后者可以使用loose index scan方法,明显 faster than 前者。

示例二

让我们再来模拟一个大一点的表:

CREATE TABLE t_1 (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  status INT NOT NULL,
  created_date DATE NOT NULL,
  INDEX idx_status_name (status,name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 10w行随机数据插入
INSERT INTO t_1 (name,status,created_date) VALUES
  ('名字1',1,'2019-12-01'),
  ('名字2',0,'2019-12-02'),
  ('名字3',1,'2019-12-02'),
  ...
  ('名字99998',0,'2020-08-08'),
  ('名字99999',1,'2020-08-09'),
  ('名字10000',1,'2020-08-10');

以下是查询语句:

-- 执行时间:13ms
-- 使用loose宽度扫描
SELECT * FROM t_1 WHERE status=1 AND name>='名字1000' AND created_date>='2020-07-01';

-- 执行时间:610ms
-- 一般扫描
SELECT * FROM t_1 WHERE status=1 AND name>='名字1000' AND created_date>='2019-07-01';

两个查询条件基本一样,但第一个使用了loose index scan,查询速度明显优于第二个方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单谈谈MySQL的loose index scan - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 拒绝“爆雷”!GaussDB(for MySQL)新上线了这个功能

    摘要:智能把控大数据量查询,防患系统奔溃于未然。 本文分享自华为云社区《拒绝“爆雷”!GaussDB(for MySQL)新上线了这个功能》,作者:GaussDB 数据库。 什么是最大读取行 一直以来,大数据量查询是数据库DBA们调优的重点,DBA们通常十八般武艺轮番上阵以期提升大数据查询的性能:例如分库分表、给表增加索引、设定合理的WHERE查询条件、限定…

    2023年4月8日
    00
  • windows 安装解压版 mysql5.7.28 winx64的详细教程

    下面是详细讲解: Windows 安装解压版 MySQL5.7.28 Winx64 的详细教程 准备工作 首先需要准备 MySQL5.7.28 的解压版安装包,可以在MySQL官网下载对应版本的 Windows ZIP Archive。 安装过程 下载解压版安装包后,解压到目标文件夹下,例如解压到 D:\Programs\mysql-5.7.28-win64…

    MySQL 2023年5月18日
    00
  • mysql插入记录INSERT与多表更新

    1、第一种:INSERT [INTO] tbl_name[ (col_name, … ) ]  {VALUES | VALUE}({expr |default}, … ), (…), … 如果为自动编号的字段赋值的话,可以采用NULL或者DEFAULT让其采用默认的递增的形式来实现。 INSERT users VALUES(DEFAULT, …

    MySQL 2023年4月16日
    00
  • mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)

    优化表和修复表是MySQL数据库中两个重要的命令,可以用来修复损坏的表以及提高表的查询效率。下面是具体的使用说明和操作步骤。 REPAIR TABLE命令 REPAIR TABLE命令的作用是修复损坏的表。如果一个表在运行过程中出现了错误,比如遭到非正常的系统关机或者硬件故障等,可能会导致某些数据被破坏。此时,使用REPAIR TABLE命令可以修复这些损坏…

    MySQL 2023年5月19日
    00
  • MySQL如何处理无效数据值?

    MySQL会在处理无效数据值时,根据数据类型和使用场景的不同,采取不同的处理方式。主要包括以下几种方式: 数据类型不匹配时,MySQL会自动进行数据类型转换。例如,如果数字类型的字段中存储了字符串类型的数据,MySQL会尝试将其转换为数字类型。如果转换失败,MySQL会将其转换为0或NULL。 字符串类型的字段中存储了超长数据时,MySQL会根据字段的定义,…

    MySQL 2023年3月10日
    00
  • GaussDB(DWS)网络流控与管控效果

    摘要:本文主要介绍GaussDB(DWS)网络流控能力,并对其管控效果进行验证。 本文分享自华为云社区《GaussDB(DWS)网络流控与管控效果》,作者:门前一棵葡萄树。 上一篇博文GaussDB(DWS)网络调度与隔离管控能力,我们详细介绍了GaussDB网络调度逻辑,并简单介绍了如何应用网络隔离管控能力。本篇博文主要介绍GaussDB(DWS)网络流控…

    MySQL 2023年5月5日
    00
  • 64位Win10系统安装Mysql5.7.11的方法(案例详解)

    这里将详细讲解在64位Win10系统上安装Mysql5.7.11的方法。 准备工作 首先,需要准备好Mysql5.7.11的安装文件和Winrar软件。Mysql5.7.11的安装文件可以从Mysql官网上下载,Winrar软件则可在官网或其他下载站点上获得。 安装步骤 解压Mysql5.7.11安装文件 双击Mysql5.7.11安装文件中的压缩包,使用W…

    MySQL 2023年5月18日
    00
  • MySQL磁盘碎片整理实例演示

    下面是关于MySQL磁盘碎片整理实例演示的完整攻略。 什么是MySQL磁盘碎片? MySQL是一款非常流行的开源数据库,在使用MySQL过程中,经常会发现数据库运行得越久,磁盘空间占用越大的情况。这是由于MySQL的磁盘碎片导致的。 MySQL磁盘碎片是指由于频繁的数据增删改、数据长度变化等原因,导致数据在磁盘上存储的不是连续存储的情况,而是散落在磁盘的不同…

    MySQL 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部