此博文带有强烈的业务倾向性,不适用所有场景,我的业务,最终结果只会出现1条结果。
直接上SQL,然后逐一分析(所有Where查询条件,都有索引),如果你是新手(好吧,其实我也是新手),可以自行分析下,哪条查询效率最佳:
SELECT * FROM XXX_0 WHERE XXX_START >= 0 AND XXX_END <= 0;
SELECT * FROM XXX_0 WHERE XXX_START <= 0 AND XXX_END >= 0 LIMIT 1;
SELECT * FROM XXX_0 WHERE 0 BETWEEN XXX_START AND XXX_END;
SELECT * FROM XXX_0 WHERE 0 BETWEEN XXX_START AND XXX_END LIMIT 1;
SELECT * FROM XXX_0 WHERE XXX_START >= 0 LIMIT 1;
五条SQL,依次编号为:0-4。
0和1,都是通过>&<做范围查询,至于使用LIMIT 1的效率提升呢?提升肯定是有的,根据我得数据规模泛泛测试,效率大概提升2倍,但,更重要的是,加入Limit后,查询结果能够被一级缓存保存!这是Limit最大的好处。当然,从底层分析的话,加入Limit 1后,匹配到一条数据后,就不会再往下查询了,所以,性能的提升和数据量的大小有很大关系。
2和3,情况貌似和0、1差不多,但其实有差别的,大于等于查询,如果没有limit的话(相信对结果的数目也有限制),无法被一级缓存缓存,而between的结果,则能够被缓存。所以,如果能用between,那么就不要使用大于等于了。
4,根据我的业务,这才是最优查询,为什么呢?我只需要使用一个索引,这无疑降低了IO开销,同时,使用LIMIT 1保证匹配到一条数据后,就不再往下查询,提升了执行效率,还有就是一级缓存的使用了。
PS:SQL优化真是博大精深啊,还有,用BETWEEN的时候注意顺序噢。