小伙伴们估计遇到过在数据量超过几十万的时候使用where .... order by .... limit 1这样的语句,花费的时间比where .... order by ....还要慢,这是为什么呢?
开始我也不知道为什么,网上找了很多,发现不少人遇到了这样的问题,按照我们正常的逻辑思维,这条语句执行应该是先使用order by 的索引,然后使用where 条件,最后在截取一条返回给我们是不是?然而并不是如此,下面我以项目中的数据来测试
我们数据在百万这个级别,OK我们使用where .... order by .... limit 1这样的语句来看看效果
这样一个查询花费了19秒,对于我们线上业务来说是不能够接受的,我们尝试去掉limit呢
一看吓一跳是不是,居然用了limit时间还多花费了几十倍,我们使用EXPLAIN(不知道这个的同学可以单独百度一下)来检查一下这两条sql
区别很大是不是,使用limit虽然类型是index而且可能用到bookId索引,结果直接就是使用的where;而没使用limit的时候类型是ref,结果是使用了条件索引bookId和文件索引,具体的原因我没有深入去寻找答案,但是我猜测应该跟mysql内部优化算法有关系,不纠结这个,我们先说说怎么去解决这个问题,感兴趣的可以自行google
不走索引?那我们就让他强制索引force index
哇塞效果很理想嘛,跟不使用limit的差不多,而且只返回一条,but难道以后我们都要自己去添加强制索引吗?然后捉摸着我找到了另外一种迂回的方式,如下
看起来确实很迂回,但是我们确实不需要强制指定索引了,让mysql自己选择最好的索引吧 哈哈