`

MySQL索引最左匹配原则

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2433805

 

创建一个测试表

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` varchar(32) NOT NULL,
  `b` varchar(32) NOT NULL,
  `c` varchar(64) NOT NULL,
  `d` varchar(128) NOT NULL,
  `e` varchar(256) NOT NULL,
  `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),  
  `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), 
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

插入数据

INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');
INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES('a', 'b', 'c', 'd', 'e');

 

查看索引

show index from test;


 

查看执行计划

explain select * from test where id = "1";


 

explain select * from test where a = "1";


 

explain select * from test where b = "1";


 

explain select * from test where a = "1" and b = "1";


 

创建索引(a和b的联合索引)

create index idx_a_b on test(a, b);

 

查看索引

show index from test;


 

查看执行计划

explain select * from test where a = "1";


 

explain select * from test where b = "1";


 

explain select * from test where a = "1" and b = "1";


 

创建索引(b的索引)

create index idx_b on test(b);

查看索引

show index from test;


 

查看执行计划

explain select * from test where a = "1";


 

explain select * from test where b = "1";


 

explain select * from test where a = "1" and b = "1";


 

删除索引

drop index idx_a_b on test;
drop index idx_b on test;

 

删除索引后,创建a, b, c 3个字段的联合索引

create index idx_a_b_c on test(a, b, c);

查看如下语句的执行计划

-- ref
explain select * from test where a = "1";
-- all 扫全表
explain select * from test where b = "1";
-- all 扫全表
explain select * from test where c = "1";
-- ref
explain select * from test where a = "1" and b = "1" and c = "1";
-- ref
explain select * from test where a = "1" and b = "1";
-- ref
explain select * from test where a = "1" and c = "1"
-- all 扫全表
explain select * from test where b = "1" and c = "1"

  

  • 大小: 32.4 KB
  • 大小: 23.4 KB
  • 大小: 27.4 KB
  • 大小: 26.4 KB
  • 大小: 26.8 KB
  • 大小: 48 KB
  • 大小: 25.6 KB
  • 大小: 26.1 KB
  • 大小: 27.8 KB
  • 大小: 55.7 KB
  • 大小: 24.9 KB
  • 大小: 25.7 KB
  • 大小: 27 KB
分享到:
评论

相关推荐

    MySQL组合索引与最左匹配原则详解

    之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 什么时候创建组合索引? 当我们的where查询存在多个...

    深入浅析Mysql联合索引最左匹配原则

    然而,如果查询条件只匹配了联合索引的部分左侧列,例如`SELECT * FROM test WHERE col2=“2”`,虽然最左匹配原则不完全满足,但MySQL依然能够使用索引的部分,这被称为“部分索引匹配”。在这种情况下,MySQL会...

    mysql索引最左原则实例代码

    MySQL索引最左原则是指在MySQL数据库中,利用复合索引时,查询条件要尽量匹配索引的最左边字段,这样才能有效地利用索引,加快查询速度。理解最左原则对于优化数据库查询性能至关重要。 首先,当我们创建复合索引时...

    mysql-实用-索引失效和优化原则

    mysql-实用-索引失效和优化原则

    MySQL索引原理及慢查询优化1

    在最左前缀匹配原则下,如果查询条件匹配索引的最左边一列或多列,数据库可以利用该索引。在示例SQL中,创建一个包含`status`, `operator_id`, `type`, `operate_time`的联合索引,并且考虑到`operate_time`的范围...

    mysql面试题,涉及MySQL基础、MySQL索引、MySQL语句 MySQL进阶等方面,适用于初、中级开发人员

    在 MySQL 中,联合索引的建立遵循最左匹配原则,也就是说,索引的建立顺序是从左到右的。例如,在一张表 test 中建立了联合索引(a,b,c),使用下面的 SQL 语句问那些语句用到了索引?根据索引的最左匹配原则,...

    MYSQL索引知识

    2. **MySQL索引的优缺点和使用原则**: - **优点**:可以给任何列创建索引,提升查询速度。 - **缺点**:创建和维护索引需要时间,占用额外存储空间,且影响数据的增删改操作速度。 使用索引时应遵循一定的原则...

    mysql多条件索引

    MySQL中的索引是一种提高...总结起来,MySQL的多条件索引利用了最左前缀原则,提高了复杂查询的执行速度,但设计合理的索引结构和顺序至关重要。通过理解这些原理,我们可以更有效地优化数据库,提升系统的整体性能。

    【含动画效果】mysql索引原理与最佳实践.pptx

    从数据结构底层实现,阐述B树、B+树的特点,到mysql为什么选择了B+树作为...最后列举一些sql是否可走索引,涉及最左匹配原则、索引覆盖、范围查询等原则,以及sql优化建议。 笔者使用此ppt分享,取得了较好的现场效果。

    MYSQL索引注意事项及其优化

    但是,需要注意组合索引的左边匹配原则,即组合索引的前面字段需要被使用,否则索引不会被命中。 3. LIKE 语句:使用 LIKE 语句时,如果“%”放在前面,则一定不能命中索引。 实践例子 使用 uvip_uc_user 表作为...

    mysql索引失效.docx MySQL索引失效是指在查询执行过程中,数据库无法有效地使用索引来提高查询性能

    **分析**:此查询会利用联合索引`sname,s_code,address`中的`sname`部分,符合最左匹配原则,因此会使用索引。 2. **查询语句**: ```sql SELECT create_time FROM student WHERE s_code = 1; ``` **分析**:...

    MySQL索引_011

    对于多列索引,数据库会首先根据最左前缀原则使用最左侧的列进行索引查找,然后逐列进行匹配。 索引虽然能提高查询效率,但也会占用额外的存储空间,并在插入、删除和更新记录时增加开销。因此,合理地设计和使用...

    MySQL索引机制(详细+原理+解析).doc

    复合索引遵循最左前缀匹配原则,即在查询时必须从左到右匹配索引的列。 3. 唯一索引 唯一索引是指索引列的值必须唯一,但允许有空值。唯一索引可以确保数据的唯一性。 4. 全文索引 全文索引是在 MySQL 5.6 版本...

    mysql索引优化.rar

    7. **最左前缀原则** - 在复合索引中,查询会从左到右匹配索引,如果中间有列未出现在查询条件中,右侧的列将不会被使用。 8. **索引失效情况** - 使用`OR`连接不同列时,如果没有单个索引包含所有列,可能会导致...

    Mysql数据库索引创建、索引删除、索引失效场景详解

    使用时需遵循最左原则,即查询时应按索引列的顺序从左到右匹配。创建复合索引的方法与创建普通索引类似,只是涉及多个列。 5. 全文索引:用于解决大数据量的模糊查询问题。它通过分词技术建立索引,提高搜索效率。...

    74 再来看看几个最常见和最基本的索引使用规则l.pdf

    最左前缀匹配原则是指,当我们使用like语句进行模糊匹配查询时,只有当匹配字符串为索引列的确定的最左前缀时,才能使用索引。例如,使用 class_name LIKE '1%' 是可以利用索引的,因为查询开始于一个明确的左前缀。...

Global site tag (gtag.js) - Google Analytics