mysql单列索引和多列索引_MySQL单列索引和组合索引(联合索引)的区别详解 – 小松博客...

本文通过实验详细解析MySQL中单列索引与多列(联合索引)的区别。在面试中,对于`WHERE a='1' AND b='2'`的查询,面试官认为仅需对b列加索引即可,但作者发现,多列索引在某些情况下能提供更优的查询效率。通过创建用户表并模拟数据,作者展示了单列索引与联合索引在特定查询下的执行时间差异,证明了联合索引的优势。文章最后提到了最左前缀原则,并邀请读者加入相关技术交流群进行讨论。
摘要由CSDN通过智能技术生成

发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引【推荐阅读:对mysql使用索引的误解】

MySQL单列索引和组合索引(联合索引)的区别详解初始我写这篇文章的原因在于面试到一家大的游戏公司的时候,一个面试题大致的内容是怎么加速这个where a=’1′ 和 where a=’1′ and b=’2′,当时我答题的时候回答的是a加索引,a和b加联合索引。面试官跟我聊题目的时候说 where a=’1′ and b=’2′ 在加一个b的索引就好了,因为之前加过a的单列索引了,他很确定的告诉我,因为我没有测试过,所以没有反驳。在回去的路上我一直想不通,多个单列的索引和联合索引都一样的速度,联合索引还有什么用?今天有空来做个试验,当然之前我已经查过资料了,为了确定一下创建一个users表CREATE TABLE `users` (

`userID` int(11) NOT NULL AUTO_INCREMENT,

`userName` varchar(20) NOT NULL,

`password` varchar(20) NOT NULL,

PRIMARY KEY (`userID`)

)

创建一个genUsers存储过程,用来模拟数据delimiter $

create procedure genUsers()

begin

declare i int default 0;

while i < 100000 do

set i = i + 1;

insert into users(userID,userName,`password`) values(i,concat('username',i),concat('password',i));

end while;

end $

delimiter ;

执行存储过程call genUsers();

复制表结构和数据CREATE TABLE users2 SELECT * FROM users;

添加userName,password单列索引alter table users add index userName(userName);

alter table users add index password(password);select * from users where userName like 'username65%' and password like 'password65%'; 执行时间0.06 秒alter table users2 add index userName_password(userName,password);select * from users2 where userName like 'username65%' and password like 'password65%’;执行时间0.00秒

上面的结果每台机子测试的结果可能有所不同原因是在mysql执行查询的时候,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。最左前缀:顾名思义,就是最左优先,打一比方alter table users add index lname_fname_age(lname,fname,age);创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)联合索引以及(lname,fname,age)联合索引。

QQ交流群:136351212(满) 455721967

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值