首页 > 数据库 >MySQL的最左原则

MySQL的最左原则

时间:2023-10-11 11:35:08浏览次数:33  
标签:name 原则 age 查询 索引 MySQL WHERE

一、简述

  • MySQL索引的最左原则指的是,当使用多列索引时,MySQL会优先使用索引中最左边的列。如果查询条件中包含了索引的最左列,那么MySQL会使用这个索引来加速查询。
  • 更具体的描述:建立一个索引,对于索引中的字段,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配

二、实际场景

  1. 单一列索引:

    假设有一个表users,其中有一个age列,我们为这个列创建了一个索引idx_age。如果查询条件是WHERE age > 18,那么这个索引就会被用到。如果查询条件是WHERE name = 'John',那么这个索引就不会被用到,因为name列并没有被包含在索引中。

  2. 联合索引:

    假设有一个表users,其中有两个列agename,我们为这两个列创建了一个联合索引idx_age_name。如果查询条件是WHERE age > 18 AND name = 'John',那么这个索引就会被用到,因为查询条件中包含了索引的最左侧列age。如果查询条件是WHERE name = 'John' AND age > 18,那么这个索引就不会被用到,因为查询条件中没有包含索引的最左侧列age

  3. 前缀索引:

    假设有一个表products,其中有一个brand列,我们为这个列创建了一个前缀索引idx_brand_prefix。如果查询条件是WHERE brand LIKE 'A%',那么这个索引就会被用到,因为查询条件中包含了索引的最左侧连续若干列。如果查询条件是WHERE brand LIKE '%A',那么这个索引就不会被用到,因为查询条件中没有包含索引的最左侧列。


三、具体例子

  • 例子1:假设有一个索引idx(a, b, c),其中a是第一列,b是第二列,c是第三列。如果查询条件是WHERE a = 1 AND b = 2,那么MySQL会使用这个索引来加速查询。因为a是索引中最左边的列,它符合最左原则。

    但是,如果查询条件是WHERE b = 2 AND c = 3,那么MySQL不会使用idx(a, b, c)索引,因为它不满足最左原则。在这个情况下,MySQL可能会使用一个名为idx2(b, c)的另一个索引来加速查询。

  • 例子2:a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的(c中有>),如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整


四、注意事项

  1. 查询条件的顺序很重要。查询条件中要按照索引的最左列到最右列的顺序出现,才能利用索引进行加速查询。否则,索引就无法被用到。
  2. 单个字符的通配符可以使用索引。比如,查询条件是WHERE name LIKE 'A%',这样可以利用索引进行加速查询。但是,如果通配符出现在字符串的中间或者右侧,比如WHERE name LIKE '%A',那么就无法使用索引了。
  3. 不要在列上进行计算。如果查询条件中含有函数或者表达式,会导致索引失效而进行全表扫描。比如,查询条件是WHERE YEAR(birthday) < 1990,这样无法使用索引进行加速查询。正确的做法是,将函数或者表达式放到查询条件的右侧,比如WHERE birthday < '1990-01-01'
  4. 索引不会包含有NULL值的列。只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。因此在数据库设计时不要让字段的默认值为NULL。
  5. 尽量选择区分度高的列作为索引。区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0。覆盖索引是一个非常有用的工具,能够极大的提高性能。
  6. 最左原则仅适用于多列索引。对于单列索引,因为它本身就是最左的列,所以不需要使用最左原则。

标签:name,原则,age,查询,索引,MySQL,WHERE
From: https://www.cnblogs.com/Enid/p/17756657.html

相关文章

  • MySQL--索引
    MySQL--索引索引概述索引是帮助MySQL高效获取数据的数据结构(有序)演示使用全表扫描性能极低使用二叉搜索树更高效优缺点索引结构B+Tree索引Hash索引R-Tree(空间索引)Full-text(全文索引)存储引擎支持情况平常所说的索引都是指的B+树索引二叉树B-Tree(多路......
  • Apipost一大波新功能来袭!连接数据库、TCP协议、MySQL DDL数据导入
    本次Apipost带来数据库功能、TCP协议调试等重量级功能,感兴趣的话大家升级试试吧~数据库配置Apipost提供了数据库连接功能,以便开发者可以在接口调试中可以使用数据库获取入参或进行断言校验目前7.2.2的Apipost支持Mysql、SQLSever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Re......
  • es和mysql的对比
         ......
  • 探索Redis与MySQL的双写问题
    本文已收录至GitHub,推荐阅读......
  • 深入浅出MySQL MRR(Multi-Range Read)
    本文已收录至GitHub,推荐阅读......
  • 探索Redis与MySQL的双写问题
    本文已收录至GitHub,推荐阅读......
  • mysql 行锁,间隙锁,临键锁
    mysql中的行锁,临键锁,间隙锁都是为了解决innodb引擎下事务隔离级别的一系列排他锁行锁:也称为记录锁,当我们对mysql表中的某一条记录,或者唯一索引加锁的时候,innodb会默认对这一行记录进行加锁,避免其他事务对其进行修改间隙所:顾名思义,就是锁定一个索引的区间,在普通索引或者唯一索......
  • 2023_10_10_MYSQL_DAY_02_笔记
    2023_10_10_MYSQL_DAY_02_笔记#在FROM子句中使用子查询SELECTa.ename,a.sal,a.deptno,b.salavgFROMempa,(SELECTdeptno,AVG(sal)salavgFROMempGROUPBYdeptno)bWHEREa.deptno=b.deptnoANDa.sal>b.s......
  • 2023_10_10_MYSQL_DAY_02_课后题
    2023_10_10_MYSQL_DAY_02_课后题#06章1--7题#1.查询10号部门所有员工的员工姓名,员工工资,工资级别。SELECTe.ename员工姓名,e.`sal`员工工资,s.`grade`工资级别FROMempe,salgradesWHEREe.`deptno`=10ANDe.`sal`BETWEENs.`losal`ANDs.`hisal`;#2.查询2......
  • MySQL5.7 windows安装
    安装Mysql前:​ 1、如果:你(曾经安装过),需要(先卸载干净),否则是(装不上)的。所以先谈(卸载)​2、如果:你没有(安装过),这是(第一次安装),请直接看(第2部分)Mysql安装教程。1、Mysql彻底卸载分为三个步骤: 1、卸载Mysql(软件) 2、删除Mysql(残留文件) 3、删除mysql(注册表) 4、重启电......