如果执行select * from T where k between 3 and 5,需要搜索几棵树?扫描多少行?
    创建表的语句如下:

    1. create table T (
    2. ID int primary key,
    3. k int NOT NULL DEFAULT 0,
    4. s varchar(16) NOT NULL DEFAULT '',
    5. index k(k)) engine=InnoDB;
    插入数据的语句如下:
    
    insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
    
    执行这个语句会经过哪些过程呢?首先我们搜索k索引树,找到第一个满足条件的叶子节点,也就是k=3的叶子节点,然后拿到叶子节点中的主键值,回到主键索引中找到完整的数据行,取出数据行中的信息,再回到k搜索树中找到k=3的叶子节点的下一个节点,如果仍然满足条件,重复上面的过程,直到下一个节点的k值不满足条件。<br />从上面的过程可以看到,执行这个语句搜索了两棵树,回表了两次,扫描了多少行是什么意思?<br />可以看到,在上面的例子中回表了两次,因为我们没有把字段k设置为主键索引,那么我们有办法既不把字段k设置为主键索引,也不会回表查询吗?有的,只要我们搜索的索引树中保存了想要查询的数据,即使搜索的不是主键索引树,也不会发生回表。比如如果我们执行的语句是select ID from T where k between 3 and 5,就不会发生回表。这时的k索引被称为覆盖索引,也就是覆盖了查询需求的索引。<br />由于覆盖索引可以避免回表,可以减少树的搜索次数,所以这种手段能够显著加快查询的速度,是我们常用的一种优化数据库查询的方法。<br />在一个市民信息表上,是否有必要将身份证号和姓名建立联合索引?如果我们需要经常根据身份证号来查询个人信息,那么我们在身份证号字段上建立一个索引不就可以了吗?就可以快速的定位到想要查询的数据行了,为什么要将身份证号和姓名建立联合索引呢?建立联合索引在根据身份证号查询姓名的业务场景中很有用,这样就避免了回表查询,加快了语句查询的速度。<br />建立一个联合索引,就只是建立了一个索引吗?并不是,建立一个联合索引相当于按照最左前缀原则建立了多个索引,联合索引树中的叶子节点是按照什么顺序排列的?是按照联合索引定义中字段出现的顺序排列的,也就是说联合索引树中的叶子节点先按照第一个字段的值进行排序,如果第一个字段的值相同,那么就按第二个字段的值进行排序,以此类推,直到把所有的叶子节点排完序。所以如果在查询条件中只出现了第一个字段的等值查询或者范围查询,叶子节点对于第一个字段是有序的,根据多叉搜索树的结构也可以快速定位到第一个满足查询条件的叶子节点(多叉搜索树是怎么定位的?),在定位到第一个叶子节点后,只需要依次判断下一个叶子节点是否满足条件即可,直到遇到不满足查询条件的叶子节点停止。如果在查询条件中出现了第一个字段的等值查询和第二个字段的等值查询,那么搜索树的过程是什么样的?如果在查询条件中出现了第一个字段的范围查询和第二个字段的等值查询,那么搜索树的过程是什么样的?如果在查询条件中只出现了第一个字段的后模糊查询,那么搜索树的过程是什么样的?如果在查询条件中出现了第一个字段的模糊查询和第二个字段的等值查询,那么搜索树的过程是什么样的?(核心问题就是多叉搜索树是怎么搜索的?)<br />既然建立一个联合索引相当于按照最左前缀原则建立了多个索引,那么联合索引中字段的顺序就很重要,那么我们该如何安排联合索引中字段的顺序呢?安排联合索引中字段顺序最重要的原则是如果某个顺序能够减少需要创建的索引的数量,那么就优先考虑采用这个顺序。<br />如果建立一个联合索引并不足以满足我们的需求,比如上面虽然建立了身份证号和姓名的联合索引,但是如果我们既有根据身份证号查询的场景,又有根据姓名进行查询的场景,这个时候既要建立联合索引,也要对这两个字段中的某一个建立索引,那么选择哪一个来建立索引呢?选择其中占用空间少的字段来建立。建立联合索引的目的是为了加快根据身份证号查询姓名信息的速度,如果没有这个需求也可以不建立联合索引,只在两个字段上分别建立索引。<br />如果有的语句查询条件中的字段有多个,但是这些字段并不能全部走索引,那么搜索树的过程是什么样的呢?不能全部走索引是什么意思?什么时候才会字段不能全部走索引呢?<br />假如我们现在已经建立了(name,age)的联合索引,现在要执行如下sql语句:
    
    select * from tuser where name like '张%' and age=10 and ismale=1;
    

    那么这几个字段中哪些字段可以走索引呢?走索引是什么意思呢?为什么不能走索引呢?