前言,用于问题验证探究,可能不太严谨,不正之处望各大大们指正
朋友遇到的一道面试题,自认为MySQL索引学的不错的我,竞一时不敢确定的回答他,特来测试一波
问题
MySQL(InnoDB) 在执行查询的过程中,同时命中两个单列索引,
mySQL会使用哪一列索引?
SELECT * FROM indexestest WHERE name= '测试1' and age = '1';
(id为主键,name 和 age 都添加了普通BTree索引)
先说结论
会根据
索引的添加顺序
来进行操作
验证
表数据的建立
# 先创建表 ,给id primary key , 给 name 和age 加上 key ,nkey索引添加在前
create TABLE indexesTest (
`id` int(11) NOT NULL AUTO_INCREMENT primary key,
`name` varchar(25) default NULL,
`age` int(11) default null,
key `nKey` (`name`) using BTREE,
KEY `aKey` (`age`) using BTREE
) AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
# 先创建表 ,给id primary key , 给 name 和age 加上 key,akey索引添加在前
create TABLE indexesTest2 (
`id` int(11) NOT NULL AUTO_INCREMENT primary key,
`name` varchar(25) default NULL,
`age` int(11) default null,
KEY `aKey` (`age`) using BTREE,
key `nKey` (`name`) using BTREE
) AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
# 添加数据
INSERT INTO `indexestest`(`name`, `age`) VALUES ('测试1', 1);
INSERT INTO `indexestest2`(`name`, `age`) VALUES ('测试1', 1);
通过Explain 进行查询分析
nkey在前查询测试
EXPLAIN SELECT * FROM indexestest WHERE `name` = '测试1' and age = '1';
akey在前查询测试
EXPLAIN SELECT * FROM indexestest2 WHERE `name` = '测试1' and age = '1';
版权声明:本文为qq_43781399原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。