联合索引的最左前缀匹配原则

2023-05-16

假设数据 表 T (a,b,c) rowid 为物理位置

rowid a b c
(1) 1 1 1
(2) 2 1 13
(3) 2 2 14
(4) 1 3 3
(5) 2 3 12
(6) 1 2 5
(7) 2 3 9
(8) 1 2 2
(9) 1 3 6
(10) 2 2 11
(11) 2 2 8
(12) 1 1 7
(13) 2 3 15
(14) 1 1 4
(15) 2 1 10

当你创建一个索引 create index xxx on t(a,b),则索引文件逻辑上等同于如下

a b rowid
1 1 1
1 1 12
1 1 14
1 2 6
1 2 8
1 3 4
1 3 9
2 1 2
2 1 15
2 2 3
2 2 10
2 2 11
2 3 5
2 3 7
2 3 13

当 select * from T where a = 1 and b = 3 的时候, 数据库系统可以直接从索引文件中直接二分法找到 A = 1 的记录,然后再 B = 3 的记录
但如果你 where b = 3 则需要遍历这个索引表的全部

mysql 建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:

如果有一个 2 列的索引 (col1, col2),则已经对 (col1)、(col1, col2) 上建立了索引;
如果有一个 3 列索引 (col1, col2, col3),则已经对 (col1)、(col1, col2)、(col1, col2, col3) 上建立了索引;

原理

  • b+ 树的数据项是复合的数据结构,比如 (name,age,sex) 的时候,b+ 树是按照从左到右的顺序来建立搜索树的,比如当 (张三,20,F) 这样的数据来检索的时候,b+ 树会优先比较 name 来确定下一步的所搜方向,如果 name 相同再依次比较 age 和 sex,最后得到检索的数据;但当 (20,F) 这样的没有 name 的数据来的时候,b+ 树就不知道第一步该查哪个节点,因为建立搜索树的时候 name 就是第一个比较因子,必须要先根据 name 来搜索才能知道下一步去哪里查询

  • 比如当 (张三, F) 这样的数据来检索时,b+ 树可以用 name 来指定搜索方向,但下一个字段 age 的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是 F 的数据了, 这个是非常重要的性质,即索引的最左匹配特性。(这种情况无法用到联合索引)

mysql 查询优化器

如果建的索引是 (name, cid)。而查询的语句是 cid=1 AND name=’小红’。为什么还能利用到索引?

当按照索引中所有列进行精确匹配(“=” 或 “IN”)时,索引可以被用到,并且 type 为 const。理论上索引对顺序是敏感的,但是由于 MySQL 的查询优化器会自动调整 where 子句的条件顺序以使用适合的索引,所以 MySQL 不存在 where 子句的顺序问题而造成索引失效

注意事项

  1. 范围查询
    mysql 会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。范围列可以用到索引,但是范围列后面的列无法用到索引。即,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引

  2. like 语句的索引问题
    如果通配符 % 不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀
    在 like “value%” 可以使用索引,但是 like “%value%” 不会使用索引,走的是全表扫描

  3. 不要在列上进行运算
    如果查询条件中含有函数或表达式,将导致索引失效而进行全表扫描
    例如 select * from user where YEAR(birthday) < 1990
    可以改造成 select * from users where birthday <’1990-01-01′

  4. 索引不会包含有 NULL 值的列
    只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL 值,那么这一列对于此复合索引就是无效的。所以在数据库设计时不要让字段的默认值为 NULL

  5. 尽量选择区分度高的列作为索引,区分度的公式是 count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是 1,而一些状态、性别字段可能在大数据面前区分度就是 0。一般需要 join 的字段都要求区分度 0.1 以上,即平均 1 条扫描 10 条记录

  6. 覆盖索引的好处
    如果一个索引包含所有需要的查询的字段的值,我们称之为覆盖索引。覆盖索引是非常有用的工具,能够极大的提高性能。因为,只需要读取索引,而无需读表,极大减少数据访问量

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

联合索引的最左前缀匹配原则 的相关文章

  • RK3288刷机教程:安装Ubuntu 16.04

    网上有很多基于瑞芯微RK3288芯片的板子 xff0c 个人感觉配置都非常不错 xff01 然后就淘了两块玩玩 如下图所示 xff1a 然后可以看到 xff0c 各种接口也比较全乎 xff01 有HDMI和VGA视频输出接口 xff0c 两
  • No package ‘orocos-bfl‘ found

    目录 问题 xff1a 原因 xff1a 解决办法 xff1a 问题 xff1a 在编译ros工程的时候 xff0c 出现如下错误提示 xff1a No package 39 orocos bfl 39 found 如下图所示 xff1a
  • 卡尔曼滤波(Kalman filter)算法以及Arduino应用-mpu6050(导航贴)

    正在更新中 这篇文章要跟大家一起完全搞明白卡尔曼滤波 xff0c 连一个标点符号也不放过 xff0c 完完全全理解明白 如果你看不懂 xff0c 那说明我写的不好 本文是看了dr con博士的视频后做的 xff0c 建议可以去看看 如果哪里
  • pop_back()的用法及运行机制

    vector在c 43 43 中非常好用 xff0c 简单的说 xff0c vector是一个能够存放任意类型的动态数组 能够增加和压缩数据 一般使用push back 和pop back 函数将数据存放进容器末尾 如下例程 xff1a i
  • Gazebo为机器人添加传感器

    Gazebo Tutorials 在gazebo仿真中 xff0c 为了验证算法 xff0c 往往需要很多传感器输入作为控制输出量的输入数据 xff0c 因此 xff0c 需要学习添加各式各样的传感器并获取传感器数据 1 IMU传感器 2
  • the selected library block “Contact_forces_lib/3D/sphere to plane force“ no longer exists

    问题 在matlab的simulink里面进行simscape仿真的时候 xff0c 由于添加了接触力 xff0c 因此实现装了 Simscape Multibody Contact Forces Library 这个库 xff0c 装完之
  • matlab画圆(及其他常用图形)

    画图 1 matlab画圆 xff08 1 xff09 代码 xff1a x 61 y 61 r 61 1 for i 61 1 100 x i 61 r cos i 2 pi 100 y i 61 r sin i 2 pi 100 plo
  • CircuitPython入门贴

    前言 以前一直玩arduino的 xff0c 但是恼火于每次写完代码 xff0c 都要编译并烧录到MCU上 xff0c 刚开始的blink例程类的小代码还好 xff0c 起码十几秒钟就能烧录成功 xff0c 但是后来随着程序代码量的增加 x
  • Ready! Use 192.168.191.2 to access clientGuru Meditation Error: Core 1 panic‘ed (LoadProhibited).

    问题描述 在用esp32通过wifi和ros主机进行话题通信的过程中 xff0c 串口一直打印如下信息 xff1a Connecting to Zhitong Ready Use 192 168 191 2 to access client
  • Kolla环境部署命令

    注 xff1a 此博客皆为经验所得 xff0c 如有雷同 xff0c 纯属巧合 xff01 1 根据需要 xff0c 配置 etc kolla global yml xff0c 可选择需要部署的容器 xff1b 2 在 etc kolla
  • Baize_ServoDriver_esp32(ROS+Arduino驱动舵机机械臂,通过串口或WiFi话题通信)(数字孪生:虚拟和现实同步)

    介绍 硬件平台 控制板 xff1a Baize ServoDriver esp32 舵机机械臂 xff1a 通过Baize ServoDriver esp32这块舵机驱动板 xff0c 我们来驱动我们的机器人 首先 xff0c 我们通过串口
  • VMware Workstation 17 Player安装Ubuntu22.04

    ps xff1a 部分内容来自于网络整合 首先去官网下载https www vmware com products workstation player html 点击DOWNLOAD FOR FREE 点击GO TO DOWNLOADS
  • opencv运行出现错误ffmpeg

    调试opencv程序 xff0c 运行时出现 xff1a Error opening file build opencv modules videoio src cap ffmpeg impl hpp 578 网络查询 xff0c 原因 x
  • 美团2014校招笔试题第二题答案分析

    今天在论坛里看到一网友贴出的美团2014校招笔试题 xff0c 其中第二题个人觉得答案应该为7次 xff0c 这里做了一个分析 xff0c 欢迎大家指出其中的纰漏 题目 xff1a 有25匹马 xff0c 每次比赛只能有5匹马参加 xff0
  • ssh连接不上

    之前执行ssh ip命令一直ok 最近换环境了 xff0c 执行ssh ip命令 xff0c 登录不了 xff0c 卡住 man一下 xff0c 知道有个 v的用法 xff1a v Verbose mode Causes ssh to pr
  • 怎么把ubuntu系统从英文修改为中文界面

    Ubuntu系统默认安装的语言是英文 xff0c 有些小伙伴使用起来可能觉得不是很方便 xff0c ubuntu是支持中文界面的 xff0c 修改方法也很简单 xff0c 下面就来看看详细的操作 1 更改语言之前首先确保你的虚拟机能够上网
  • 浅谈一次函数的斜率

    以下是一次函数的基本形式 请证明 本函数的斜率为 我们先来看斜率 我们就以函数为例 这个函数的图像是个直线 是吗 没错 所以如何求一个函数的斜率 设高为 底为 所以斜率就是 看到这个式子是不是感到和微分有关系 没错 微分的定义就是求切线函数
  • 华为 5680 OLT native vlan配置方式

    分为两部分 xff1a 1 配置给ONU端口 2 配置给OLT端口 1 在ONU 端口生效 ont port native vlan profile mode 命令功能 此命令用于配置ONT端口的缺省VLAN 当ONT的Native VLA

随机推荐