當我們需要提高mysql的查詢效能的時候,一般想到的處理辦法就是建立索引,當有多個條件進行查詢的時候,需要建立聯合索引進行查詢,而聯合索引需要符合最左匹配原則,今天就來**一下,你建立的聯合索引真的用到了嗎?
首先建立乙個學生表:
create table `student` (裡面插入資料:`id` varchar(10) not null comment '編號',
`num` varchar(20) default null comment '學號',
`name` varchar(12) default null comment '姓名',
`age` varchar(4) default null comment '年齡',
`honey` varchar(4) default null comment '愛好',
primary key (`id`),
unique key `id` (`id`)
) engine=innodb default charset=utf8 comment='學生表'
當沒有建立聯合索引的時候,下面查詢的執行計畫如下:
語句:explain select * from student a where a.num='001' and a.name='張三' and a.age='25' and a.honey='跑步'執行計畫如下:
可以看出沒有用到索引,建立(num,name,age)的聯合索引:
語句為:alter table student add index stu_index(num,name,age)
執行上面那條語句,執行計畫如下:
從執行計畫中可以看出,使用到了索引。
當語句變為:explain select * from student a where a.name='張三' and a.age='25' and a.honey='跑步'執行計畫是:
可以看出,沒有用到索引,因為根據索引的最左匹配原則,上面的sql語句是不會走索引的。
當語句為:
explain select * from student a where a.num='001' and a.age='25' and a.honey='跑步'
或者:explain select * from student a where a.num='001' and a.name='張三' and a.honey='跑步'
還是可以走索引的。而當a.num不處於where條件的第乙個位置,如下語句,還會走索引嗎?
語句:explain select * from student a where a.age='25' and a.num='001' and a.name='張三' and a.honey='跑步'
或者:explain select * from student a where a.age='25' and a.name='張三' and a.num='001' and a.honey='跑步'
執行計畫為:
還是會走索引的。所以說順序無關,主要看是不是符合最左匹配原則
MySql建立聯合索引
首先建立乙個表 create table t1 id int primary key,username varchar 20 password varchar 20 建立單個索引的語法 create index 索引名 on 表名 欄位名 索引名一般是 表名 欄位名 給id建立索引 create i...
mysql建立聯合索引 mysql之聯合索引
mysql之聯合索引測試 前期準備 建立聯合索引?create table test id bigint 16 not null auto increment,aaa varchar 16 not null,bbb varchar 16 not null,ccc int 11 not null,pr...
mysql索引的建立以及聯合索引的一些用法
聯合索引又叫復合索引。兩個或更多個列上的索引被稱作復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常...