发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询仍是须要组合索引【推荐阅读:对mysql使用索引的误解】php
MySQL单列索引和组合索引(联合索引)的区别详解 初始我写这篇文章的缘由在于面试到一家大的游戏公司的时候,一个面试题 大体的内容是怎么加速这个where a=’1′ 和 where a=’1′ and b=’2′,当时我答题的时候回答的是a加索引,a和b加联合索引。 面试官跟我聊题目的时候说 where a=’1′ and b=’2′ 在加一个b的索引就行了,由于以前加过a的单列索引了,他很肯定的告诉我,由于我没有测试过,因此没有反驳。在回去的路上我一直想不通,多个单列的索引和联合索引都同样的速度,联合索引还有什么用? 今天有空来作个试验,固然以前我已经查过资料了,为了肯定一下 建立一个users表html
CREATE TABLE `users` ( `userID` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(20) NOT NULL, `password` varchar(20) NOT NULL, PRIMARY KEY (`userID`) )
建立一个genUsers存储过程,用来模拟数据mysql
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();
复制表结构和数据sql
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(满) 455721967code
如无特别说明,本站文章皆为原创,若要转载,务必请注明如下原文信息: 转载保留版权:小松博客» MySQL单列索引和组合索引(联合索引)的区别详解 本文连接地址:https://www.phpsong.com/586.htmlhtm