详解MySQL InnoDB的索引扩展

MySQL InnoDB索引扩展详解

InnoDB是MySQL中,一个常用的事务性存储引擎,也是MySQL5.5版本以后默认的存储引擎。InnoDB对于数据的存储以及索引都有自己的特定优化策略,本文主要探讨InnoDB在索引扩展上的优化方式。

InnoDB的索引类型

InnoDB支持B-Tree索引(默认)、全文索引,以及R-Tree索引和哈希索引。

B-Tree(默认)

B-Tree是InnoDB默认的索引类型。B-Tree索引又分为聚集索引和辅助索引。聚集索引的叶子节点存储的是整个表中的行数据,而辅助索引的叶子节点仅仅存储索引值和对应的主键值。

B-Tree索引适用于离散数据类型,比如数字和字符串,但是不适用于范围查询和全文搜索。

R-Tree

R-Tree索引适用于GIS和空间数据类型,通过R-Tree,将空间数据转化为平面上的多维点来处理。

哈希索引

哈希索引主要用于等值查询,一旦查询条件不为等值查询,哈希索引就无法发挥作用。

全文索引

全文索引适用于对文本类型的字段进行搜索,InnoDB默认沿用了MySQL的MyISAM存储引擎的全文索引。

InnoDB索引扩展

InnoDB在B-Tree索引的基础之上,对于索引的扩展,引入了自适应哈希索引(ADI)以及预计数器(PSA)

自适应哈希索引

自适应哈希索引是InnoDB在运行期间动态创建的哈希索引,用于加速等值查询。当某个表上同一个等值查询的查询次数超过了一个阈值,InnoDB会自动创建基于该列的哈希索引。

例如,下面的users表格,可以使用ALTER TABLE命令,在age列上创建哈希索引:

ALTER TABLE users ADD INDEX HASH(age);

为了查看哈希索引是否生效,执行以下查询语句:

EXPLAIN SELECT * FROM users WHERE age = 31;

如果返回结果中有Using index或者Using index condition,则说明已经使用了哈希索引。

预计数器

InnoDB引入了预计数器,用于优化查找、扫描以及缓存的阈值计算。预计数器以3个值为基础:

  • count:上一次模糊计数结果
  • expected:上一次扫描的期望值
  • variation:上一次计数与期望值相差的值

基于上面的值,InnoDB对于下一次查询会调整计算方式的阈值,从而优化性能。

示例

使用employees数据库中的salaries表作为示例,其中包含员工工资的数据,并且在salary列上创建索引。

自适应哈希索引示例

假设我们需要查询薪水为10001的员工信息,代码如下:

EXPLAIN SELECT * FROM salaries WHERE salary = 10001;

可以发现,该查询语句使用的是B-Tree索引。

接下来,我们删除索引并且开启ADI:

ALTER TABLE salaries DROP INDEX salary_idx;
SET GLOBAL innodb_adaptive_hash_index = ON;
ALTER TABLE salaries ADD INDEX salary_idx (salary);

再次执行查询语句:

EXPLAIN SELECT * FROM salaries WHERE salary = 10001;

如果返回结果中有Using index或者Using index condition,则说明已经使用了哈希索引。

注意:当哈希索引的查询次数过少或者哈希索引的大小超过了一定的阈值,则哈希索引会自动禁用或者降低优先级。

预计数器示例

假设我们需要查询工资高于50000美元的员工的薪水:

EXPLAIN SELECT * FROM salaries WHERE salary > 50000;

可以发现,该查询语句使用的是全表扫描,其性能较差。

通过设置预计数器的方式,可以提高性能:

SET GLOBAL innodb_stats_sample_pages = 100;

修改之后再次执行查询语句:

EXPLAIN SELECT * FROM salaries WHERE salary > 50000;

在返回结果中,我们可以发现,其查询类型为范围查找(range),基于索引的扫描(Using index condition)。

总结

通过使用自适应哈希索引和预计数器,可以提高InnoDB索引的性能,减少全表扫描和哈希表未命中的情况,是一个有效的索引优化方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解MySQL InnoDB的索引扩展 - Python技术站

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

相关文章

  • mysql出现提示错误10061的解决方法

    下面是关于“mysql出现提示错误10061的解决方法”的完整攻略。 问题描述 当你在使用MySQL时,有时会遇到错误代码10061,描述为“无法连接,目标计算机拒绝连接。”这个错误可能会出现在多种情况下,比如你正在尝试远程连接MySQL服务器或者在本地使用MySQL时,但无论何种情况,都需要及时解决这个问题。 解决方法 要解决这个问题,你可以尝试以下几个方…

    MySQL 2023年5月18日
    00
  • 关于 MySQL 嵌套子查询中,无法关联主表字段问题的折中解决方法

    今天在工作中写项目的时候,遇到了一个让我感到几乎无解的问题,在转换了思路后,想出了一个折中的解决方案,记录如下。 其实,问题的场景,非常简单: 就是需要查询出上图的数据,红框是从 项目产品表 中查询的2个字段,绿框是从与项目产品表关联的 文章表 中查询出的1个字段。我希望实现的效果是,获取到项目产品对应的文章提交人数,即该项目产品,有多少人提交了文章。看似很…

    MySQL 2023年4月12日
    00
  • MySQL 压缩的使用场景和解决方案

    MySQL 压缩的使用场景和解决方案 压缩的使用场景 MySQL 压缩的使用场景一般是数据量过大,导致对于磁盘空间的占用过多,对数据库的备份和恢复也变得困难。此时可以选择使用 MySQL 压缩的功能来缩小数据的空间占用,提高数据库的备份和恢复效率。 解决方案 MySQL 内置了多种压缩的方式,可以通过以下方法进行压缩: 1. 使用 MyISAM 表 MyIS…

    MySQL 2023年5月19日
    00
  • mysql 5.7.9 winx64在windows上安装遇到的问题

    MySQL 5.7.9 winx64在Windows上安装遇到的问题 MySQL是一款用于管理关系型数据库的开源软件,广泛用于各种网站和应用的开发和维护中。在Windows操作系统上安装MySQL的过程中,可能会出现一些问题。本文将介绍MySQL 5.7.9 winx64在Windows上安装遇到的问题,并提供解决方案,希望能够帮助到大家。 问题一:MySQ…

    MySQL 2023年5月18日
    00
  • MySQL性能瓶颈排查定位实例详解

    MySQL性能瓶颈排查定位实例详解 前言 MySQL是一款常用的数据库管理系统,如何提升MySQL的性能,是运维工程师面临的重要问题之一。在实际开发及运维工作中,经常遇到MySQL性能瓶颈的问题。解决MySQL性能瓶颈,首先需要了解瓶颈的产生原因。本文将详细讲解MySQL性能瓶颈排查定位实例,并提供两条示例。 一、MySQL性能瓶颈的排查定位实例 1.1 慢…

    MySQL 2023年5月19日
    00
  • 浅谈MySQL安装starting the server失败的解决办法

    浅谈MySQL安装starting the server失败的解决办法 问题描述 在安装MySQL时,有可能遇到 starting the server 失败的问题。当出现这一问题时,MySQL服务将无法启动,导致无法进行数据库操作。此问题通常由于配置不当、端口占用等原因引起。本文将提供一些解决方案和注意事项,帮助你解决这一问题。 解决步骤 1. 检查端口是…

    MySQL 2023年5月18日
    00
  • MySql的优化步骤介绍(推荐)

    以下是MySql的优化步骤介绍: 1. 分析SQL语句 首先需要分析SQL语句,找出可能存在的慢查询语句,可以使用MySQL提供的slow-query-log来记录执行时间超过设定阈值的SQL语句。使用EXPLAIN分析查询语句,可以查看查询执行计划和相关索引信息,以及确定优化策略。 2. 优化数据结构 在确定慢查询语句的情况下,可以优化相关的数据结构。主要…

    MySQL 2023年5月19日
    00
  • 如何单机部署多个 MySQL 8.0 实例 ?

    在服务器资源有限的情况下,可利用该方案快速搭建各类 mysql 架构方案。各 MySQL 实例共享一个 mysqld 主程序,但各实例数据目录是独立的,存放在不同的文件夹中;好了、废话不多说,直接上干货,具体搭建步骤如下 环境介绍 实例 主机 mysql port mysqlx port datadir mysql1 192.168.31.100 3306 …

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