本人最近在研究 mysql索引相关的东西,有个问题,麻烦大牛们帮我看下,谢谢!
假设有如下一个表:
CREATE TABLE People (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gender enum('m', 'f') not null,
key(last_name, first_name, dob)
);
其中通过组合索引(last_name,first_name,dob)构成的B-TREE索引如下图所示: 假如我要根据索引查找last_name为Barrymore,first_name为Julia,dob为2000-05-16,那么mysql是怎么查找的呢?我想到的有如下两种方式:
方式一:先将last_name为Barrymore的叶子节点全部查找出来,然后将这些查找出来的节点根据first_name为Julia的查找出来,最后再通过dob得到满足条件的数据;
方式二:先查找根节点,依次遍历,只到找到满足条件last_name为Barrymore的节点,然后马上比较first_name是不是Julia,再比较dob是不是2000-05-16,如果满足这些条件,则认为这个节点数据是满足条件的,然后再去查找下个节点。
假设有如下一个表:
CREATE TABLE People (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gender enum('m', 'f') not null,
key(last_name, first_name, dob)
);
其中通过组合索引(last_name,first_name,dob)构成的B-TREE索引如下图所示: 假如我要根据索引查找last_name为Barrymore,first_name为Julia,dob为2000-05-16,那么mysql是怎么查找的呢?我想到的有如下两种方式:
方式一:先将last_name为Barrymore的叶子节点全部查找出来,然后将这些查找出来的节点根据first_name为Julia的查找出来,最后再通过dob得到满足条件的数据;
方式二:先查找根节点,依次遍历,只到找到满足条件last_name为Barrymore的节点,然后马上比较first_name是不是Julia,再比较dob是不是2000-05-16,如果满足这些条件,则认为这个节点数据是满足条件的,然后再去查找下个节点。
explain select ....
语句直接得到MYSQL的执行计划,可以一目了然的看到MYSQL是如何处理的。
2、用EXPLAIN 看SQL执行情况;
3、高性能MYSQL中有1章讲了一下MYSQL的索引。