一、简述
- MySQL索引的最左原则指的是,当使用多列索引时,MySQL会优先使用索引中最左边的列。如果查询条件中包含了索引的最左列,那么MySQL会使用这个索引来加速查询。
- 更具体的描述:建立一个索引,对于索引中的字段,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。
二、实际场景
-
单一列索引:
假设有一个表
users
,其中有一个age
列,我们为这个列创建了一个索引idx_age
。如果查询条件是WHERE age > 18
,那么这个索引就会被用到。如果查询条件是WHERE name = 'John'
,那么这个索引就不会被用到,因为name
列并没有被包含在索引中。 -
联合索引:
假设有一个表
users
,其中有两个列age
和name
,我们为这两个列创建了一个联合索引idx_age_name
。如果查询条件是WHERE age > 18 AND name = 'John'
,那么这个索引就会被用到,因为查询条件中包含了索引的最左侧列age
。如果查询条件是WHERE name = 'John' AND age > 18
,那么这个索引就不会被用到,因为查询条件中没有包含索引的最左侧列age
。 -
前缀索引:
假设有一个表
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的顺序可以任意调整。
四、注意事项
- 查询条件的顺序很重要。查询条件中要按照索引的最左列到最右列的顺序出现,才能利用索引进行加速查询。否则,索引就无法被用到。
- 单个字符的通配符可以使用索引。比如,查询条件是
WHERE name LIKE 'A%'
,这样可以利用索引进行加速查询。但是,如果通配符出现在字符串的中间或者右侧,比如WHERE name LIKE '%A'
,那么就无法使用索引了。 - 不要在列上进行计算。如果查询条件中含有函数或者表达式,会导致索引失效而进行全表扫描。比如,查询条件是
WHERE YEAR(birthday) < 1990
,这样无法使用索引进行加速查询。正确的做法是,将函数或者表达式放到查询条件的右侧,比如WHERE birthday < '1990-01-01'
。 - 索引不会包含有NULL值的列。只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。因此在数据库设计时不要让字段的默认值为NULL。
- 尽量选择区分度高的列作为索引。区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0。覆盖索引是一个非常有用的工具,能够极大的提高性能。
- 最左原则仅适用于多列索引。对于单列索引,因为它本身就是最左的列,所以不需要使用最左原则。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容