什么建立了索引,也避免了索引失效问题,还是会出现查询不走索引的情况?
其实这个问题在于CBO(Cost-based Optimizer),优化器是很强大的!他根据开销来决定是否要用索引以及用哪个索引!
总的来说Cost = Server_Cost + Engine_Cost,也就是CPU开销和io开销
那具体哪些情况会导致有索引也不走呢?
查找条数多
当查找条数非常多的情况下,二级索引然后再回表去读磁盘,开销还是挺大的。有可能优化器经过计算后就直接全表扫描主键了,只用读一遍磁盘。
索引状态分布不均
通常来讲索引建立在高选择性的字段,比如订单日期、订单ID等。但对于某些业务其实比较特殊,比如订单状态,只有三种,已完成、支付中、超时。这种业务几种状态肯定是分布不均匀的,已完成的肯定特别多,超时或者支付中可能会少。所以实际上建立索引为了索引后两种状态的订单。但是,通常优化器会认为几个状态的比例是等比的也就是各占 1 3 \frac{1}{3} 31,所以会避免过多回表而不用索引。但实际上我们就是为了查少量的才建立索引!所以这时候我们要告诉优化器这几种比例不同,这样就可以用上索引了。