对于表 user(id,name,age) 创建一个唯一联合索引 (id,name,age)
对于where id = xx and name = xx and age = xx 会使用联合索引 explain SQL type 为 const 。
对于 其他的全索引的排列组合字段 即不管是 name = xx and id = xx and age = xx 都是一样的会走联合索引
当遇到 like in < >= 等范围查询的时候,联合索引会不匹配
比如 where id = 1 and name like “xx%” and age = 23 则会利用 联合索引 进行范围查询。此时联合索引的效果比较差 explain sql 中 type 为range 即 索引范围查询 从某个索引 开始 到某个索引结束
比如 where id > 2 and name = “gaojl” 会使用 id这个索引进行范围查询
比如 where id = 2 and name like “%AAA” 会使用id 这个索引进行非唯一索引查询。即 explain type 为 ref
索引下推 是对普通索引的优化,减少了回表查询的次数,比如对于表user(id,name,age) id 为主键 (name age) 为普通索引,我们进行 where name like “xx%” and age > 23 mysql server层(查询缓存 、sql 解析 、优化查询 等等) 将读取数据的命令发送给存储引擎后,在普通索引上查询时会 继续 将另一个查询条件应用从而 减少了io次数,给mysql server 返回的数据也是少量的。如果没有索引下推,将会有多次io 查找 并将所有的结果返回给msyql服务层。
mysql 服务层 干的事情就是 对sql 解析成为关系代数表达式 然后进行优化。比如对于select A1 A2… from R1,R2 …where cond.
那么 如实真正做先 对 R1 XR2 XR3 做乘积操作,在进行选择操作 最后进行投影操作。显然乘积 会形成庞大的中间结果,所以我们应该尽可能将选择操作提前到乘积的前面去做 投影操作提前到乘积的前面去做 这种优化就是逻辑上的优化。而物理优化:我们知道对于每一种关系代数操作可能有不同的算法来实现,所以选择合适的算法是 物理优化。索引其实就是一种物理优化,通过比较使用索引 和不使用索引 或者使用哪种索引才能有较低的代价估算,从而选择合适的执行计划。