Mysql多列索引经典案例

一个经典的多列索引案例,如题:

假设某个表有一个联合索引(c1,c2,c3,c4)一下——只能使用该联合索引的 c1,c2,c3 部分
Awhere c1=x and c2=x and c4>x and c3=x
B where c1=x and c2=x and c4=x order by c3
C where c1=x and c4= x group by c3,c2
D where c1=x and c5=x order by c2,c3
E where c1=x and c2=x and c5=? order by c2,c3

创建一张测试表

create table test (
    c1 tinyint(1) not null default 0,
    c2 tinyint(1) not null default 0,
    c3 tinyint(1) not null default 0,
    c4 tinyint(1) not null default 0,
    c5 tinyint(1) not null default 0,
    index c1234(c1,c2,c3,c4)
);
//插入两条数据
insert into test values (1,3,5,6,7),(2,3,9,8,3),(4,3,2,7,5);
insert into test values (2,4,5,8,7),(1,3,5,8,4),(3,4,2,9,6);

分析A => c1=x and c2=x and c4>x and c3=x <==等价==> c1=x and c2=x and c3=x and c4>x

c1,c2,c3,c4 都能用上


分析B => select * from test where c1=1 and c2=2 and c4=3 order by c3

c1 ,c2 索引用上了,在 c2 用到索引的基础上,c3 是排好序的,因此不用额外排序,而 c4 没发挥作用


分析C => select * from test where c1=1 and c4=2 group by c3,c2

只用到 c1 索引,因为 group by c3,c2 的顺序无法利用 c2,c3 索引


分析D => select * from test where c1=1 and c5=2 order by c2,c3

C1 确定的基础上,c2 是有序的,C2 之下 C3 是有序的,因此 c2,c3 发挥的排序的作用. 因此,没用到 filesort


分析E => select * from test where c1=1 and c2=3 and c5=2 order by c3;

因为 c2 的值既是固定的,参与排序时并不考虑

时间: 2024-10-28 15:57:05

Mysql多列索引经典案例的相关文章

mysql 多列索引优化

Mysql所有的列都可以使用索引,.对相关列使用索引是提高SELECT操作性能的最佳途径.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少256字节.在索引中使用col_name(length)语法,可以创建一个只使用char和archar列的第一个length个字符的索引,按这种方式只索引列的前缀可以索引文件小的多.MyISAm和INNODb存储引擎还支持对blob和text列的索引,但是必须指定索引长度.fulltext索引用于全文搜索不

Mysql的列索引和多列索引(联合索引)

转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html 创建一个多列索引: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)  

正确理解Mysql的列索引和多列索引

MySQL数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这. [c-sharp] view plain copy 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) ); 以上创建的其实是一个多列索引

mysql 多列索引的生效规则

mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要,只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a,b,c..这样排好序的:所以你在找东西的时候才快,比如你找 "中" 这个字的解释,你肯定就会定位到目录的 z 开头部分: 组合索引可以这样理解,比如(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的: 组合索引的生效原则是  从前往后依次使用生

Mysql的列索引和多列索引

Mysql数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣. 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) ); 以上创建的其实是一个多列索引,创建列索引的代码如下: CREATE TABLE test ( id INT NOT N

mysql 多列索引学习-经典实例

索引优化 ,b-tree假设某个表有一个联合索引(c1,c2,c3,c4) 以下 只能使用该联合索引的c1,c2,c3部分A. where c1 = x and c2 = x and c4>x and c3 = xB. where c1 = x and c2 = x and c4=x order by c3C. where c1 = x and c4 = x group by c3,c2D. where c1 = ? and c5 = ? order by c2,c3E. where c1 =

mysql多列索引

1,数据库每次查询只能使用一个索引 2,假设数据 表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), 则索引文件逻辑

数据库优化 - 多列索引经典题目

题目 假设某个表有一个联合索引(c1,c2,c3,c4)一下--只能使用该联合索引的c1,c2,c3部分 A where c1=x and c2=x and c4>x and c3=x B where c1=x and c2=x and c4=x order by c3 C where c1=x and c4= x group by c3,c2 D where c1=x and c5=x order by c2,c3 E where c1=x and c2=x and c5=? order by

MySQL列索引与多列索引浅析

创建一个使用列索引的表: create table index_test1(id int not  null auto_increment,first_name varchar(30) not null,last_name varchar(30) not null,primary key(id),index index_first(first_name),index index_last(last_name))engine myisam charset utf8; 创建一个使用多列索引的表:cr