通过前面的介绍,我们知道了,查询数据的时候,即可以直接在主键索引上进行全表扫描,也可以走非主键索引,扫描后再到主键索引上回表查出最终数据。那么数据库是怎么确定要走哪种方案呢,在日常使用中,是不是也经常被MySQL误走索引而坑过呢。
首先我们先准备一个测试数据吧。
我们先建一张简单的表,表里有id, x, y三个字段,并给x和y添加索引
create table t ( id bigint(20) not null PRIMARY key, x int, y INT, key x (x), key y (y));
接着我们创建一个简单的过程,进行数据插入,我们这里插入10w条测试数据,为了防止优化器作祟,我们对值做随机数处理。
delimiter ;;create procedure mock_data()begin declare i int; set i=1; while(i<=100000)do insert into t(id, x, y) values(i, FLOOR(1 + (RAND() * 100000)), FLOOR(1 + (RAND() * 100000))); set i=i+1; end while;end;;delimiter ;
最后,执行这个过程,去喝杯咖啡。
call mock_data()
模拟数据插入完成后,我们简单执行个sql看一下x列的选择性如何: