关于多列(复合)索引使用时的一个小问题
来源:互联网 发布:网页 字幕 滚动 js 编辑:程序博客网 时间:2024/05/29 08:05
今天看官方文档 发现一个关于多列索引的一个问题见链接:
http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html
里面有这么一段话:
Suppose that a table has the following specification:
CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name));
... .... 中间省略一部分
However, the name
index is not used for lookups in the following queries:
SELECT * FROM test WHERE first_name='Michael';SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';很多小伙伴可能会将上面的话理所当然的理解为:复合索引的情况下如果没有使用到索引的第一列做查询条件或者使用 复合索引列做查询条件单之间使用or 的时候无法使用索引。
好,那么见如下的实验:
测试表上的索引如下:
PRIMARY KEY (`id`),
KEY `ind_cmrd_cid_rt2` (`report_time`,`campaign_id`),
KEY `ind_cmrd2` (`media_url`,`report_time`,`campaign_id`,`supplier_id`),
KEY `ind_msdrid` (`media_url`,`supplier_id`,`display_count`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=888411116 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1,查询所有列的情况
可见,查询*的时候走的是全表扫描,这符合手册的描述。
下面是手册中没提到的,这里需要说明一下,否则小伙伴们容易理所当然的认为都是走全表扫描:
如下:
2,查询索引列的情况
从图中可以看到,查询走了索引,并且是全索引扫描。
说白了,其实也没什么大事,个人感觉有可能有些偷懒的小伙伴容易偷懒推理,而导致误解。
good night !
- 关于多列(复合)索引使用时的一个小问题
- 关于索引使用的几个小问题
- 关于postgresql索引使用的一个问题
- 关于复合字面量的使用问题
- 复合索引的前导列如何选择?
- 复合索引的列顺序判断
- 关于使用strtok的一个小问题
- 有效使用索引+索引列上所使用的操作符+避免对唯一索引列使用null+选择复合索引主列
- 关于mysql索引的认识--复合索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引——oracle
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 复合索引和一般索引的问题
- tip:关于rangepartition用到多列的一个小案例
- 关于复合索引中的2个索引列谁在前谁在后的进一步讨论--实践篇
- 关于索引的几个小问题
- string类型在参数传递中如何作为引用,如何在函数外修改函数内的string类型
- 敏捷开发系列之旅 第四站(透明的Crystal水晶方法)
- 性能测试需要掌握什么
- MyReport数据导出引擎——MyReport的好帮手,支持Excel导出
- CF 402-D 贪心
- 关于多列(复合)索引使用时的一个小问题
- Android Alarm
- J2EE Web开发环境的搭建!!
- Commons DbUtis源码阅读四
- Mental ray 渲染器常用设置
- 校赛随笔
- win7下安装vs2008失败——解决方法
- properties文件中文乱码解决
- HibernateTemplate 详解