一个表test,有两字段a b,其中a表无索引,b表有索引,两个问题 :
1、执行SQL: select * from test where a=1 and b=2; b字段的索引有没有用到?
2、如果a b两个字段都有索引,执行上述SQL,b字段的索引有没有用到?请解释原因。

解决方案 »

  1.   

    1、执行SQL: select * from test where a=1 and b=2; b字段的索引有没有用到?
    会用到。2、如果a b两个字段都有索引,执行上述SQL,b字段的索引有没有用到?
    不一定,可能会用A索引,也可能会用B索引,也可能两个索引 MERGE起来用。 这个关键要看数据分布。
    类似问题你可以直接使用 explain select ... 得到MYSQL的执行计划。
      

  2.   

    1、会用到的。
    2、具体的看条件过滤量,少的先会用到。
    具体的看一下执行的计划了。explain select * from test where a=1 and a=2;
      

  3.   

    1、执行SQL: select * from test where a=1 and b=2; b字段的索引有没有用到?
    explain看看具体用到哪个
    2、如果a b两个字段都有索引,执行上述SQL,b字段的索引有没有用到?
    explain看看具体用到哪个
    数据库具体有哪个还是要看数据库自己判断用哪个代价更小一些
      

  4.   

    是的,1用到,但是2到底用哪个索引会看优化器的得到的反馈了:MySQL查询优化器在决定如何使用索引的时候会调用两个API:
    1) 第一个调用api返回该范围内记录的数量。
    2) 第二个调用api返回每个键值基数。
    如果b上的索引基数比较大,那么就会选择b索引