MySQL長(zhǎng)期以來(lái)對(duì)索引的建立只允許正向asc存儲(chǔ),就算建立了desc,也是忽略掉。
比如對(duì)于以下的查詢,無(wú)法發(fā)揮索引的最佳性能。
查詢一:select * from tb1 where f1 = ... order by id desc;查詢二:2. select * from tb1 where f1 = ... order by f1 asc , f2 desc;
那對(duì)于上面的查詢,尤其是數(shù)據(jù)量和并發(fā)到一定峰值的時(shí)候,則對(duì)OS的資源消耗非常大。一般這樣的SQL在查詢計(jì)劃里面會(huì)出現(xiàn)using filesort等狀態(tài)。
比如針對(duì)下面的表t1,針對(duì)字段rank1有兩個(gè)索引,一個(gè)是正序的,一個(gè)是反序的。不過(guò)在MySQL 8.0 之前的版本都是按照正序來(lái)存儲(chǔ)。
按照rank1 正向排序的執(zhí)行計(jì)劃,
按照rank1 反向排序的執(zhí)行計(jì)劃,
從執(zhí)行計(jì)劃來(lái)看,反向比正向除了extra里多了Using temporary; Using filesort這兩個(gè),其他的一模一樣。這兩個(gè)就代表中間用到了臨時(shí)表和排序,一般來(lái)說(shuō),凡是執(zhí)行計(jì)劃里用到了這兩個(gè)的,性能幾乎都不咋地。除非我這個(gè)臨時(shí)表不太大,而用于排序的buffer也足夠大,那性能也不至于太差。那這兩個(gè)選項(xiàng)到底對(duì)性能有多大影響呢?