简单谈谈MySQL的loose index scan

简单谈谈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日

相关文章

  • MySQL: mysql is not running but lock exists 的解决方法

    问题描述: 在使用MySQL时,可能会遇到“mysql is not running but lock exists”的错误提示。这种情况下无法启动MySQL服务。 解决方法: 查看MySQL进程 在终端中输入命令: ps -ef | grep mysql 如果存在类似以下输出结果,则表示MySQL进程正在运行中: mysql 8880 1 0 21:32 …

    MySQL 2023年5月18日
    00
  • MySQL慢查询日志(Slow Query Log)

    MySQL慢查询日志是MySQL默认开启的一种日志记录,它可以用来记录MySQL中执行查询语句过程中耗时长的查询语句,以便于后期对这些查询进行优化,以提高MySQL服务器的性能。 MySQL慢查询日志可以记录下查询的时间、执行的SQL语句、所用的索引、扫描的行数、返回的行数等信息,这些信息都可以用来帮助我们分析SQL语句的性能问题,以及查找潜在的性能瓶颈所在…

    MySQL 2023年3月10日
    00
  • GaussDB(DWS)字符串处理函数返回错误结果集排查

    摘要:在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从encoding和数据本身开始排查。 本文分享自华为云社区《GaussDB(DWS)字符串处理函数返回错误结果集排查》,作者: -CHEN111- 。 在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从encoding和数据本身开始排查。 直接从案例出…

    MySQL 2023年5月6日
    00
  • MySQL 8.0 对 limit 的优化技巧

    MySQL 8.0 对 limit 的优化技巧主要包括两方面内容:使用优化器新特性和合理选择limit参数。 优化器新特性 MySQL 8.0 引入了新的优化器特性“Cost Model”,会动态计算执行单元的成本,从而有效地提高查询速度,对 limit 的优化也得到了加强。在使用 limit 时,可以通过设置 MYSQL_OPTIMIZE_LIMIT_OF…

    MySQL 2023年5月19日
    00
  • docker安装mysql,设置mysql初始密码

    docker安装mysql,只需要2分钟就可以完成 docker search mysql 拉取mysql镜像(https://hub.docker.com/_/mysql) docker pull mysql:5.7 官网可查看存在的镜像,以及需要的版本号 运行mysql(–name 容器名称  -e MYSQL_ROOT_PASSWORD设置初始密码 …

    MySQL 2023年4月12日
    00
  • 配置ogg异构oracle-mysql(3)目的端配置

    目的端配置大致分为如下三个步骤:配置mgr,配置checkpoint table,配置应用进程 在目的端先创建一张表,记得带主键: mysql> create database hr;Query OK, 1 row affected (0.00 sec) mysql> use hrDatabase changedmysql> create …

    MySQL 2023年4月12日
    00
  • Mysql索引覆盖如何实现

    这篇“Mysql索引覆盖如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Mysql索引覆盖如何实现”文章吧。 1.什么是覆盖索引 通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个…

    MySQL 2023年4月11日
    00
  • Mysql运行环境优化(Linux系统)

    下面是Mysql运行环境优化(Linux系统)的完整攻略。 概述 Mysql是常用的关系型数据库,在生产环境中需要进行优化。在Linux系统上,我们可以通过以下几个方面进行优化:内存、磁盘I/O、网络和Mysql配置。 内存优化 在Linux系统上,内存分为物理内存和交换空间。为了获得更好的数据库性能,我们需要把Mysql的工作集保持在内存里面,以减少磁盘I…

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