如何選擇數(shù)據(jù)庫(kù) MySQL中一條排序語句order by是如何工作的?
MySQL中一條排序語句order by是如何工作的?MySQL長(zhǎng)期以來對(duì)索引的建立只允許正向asc存儲(chǔ),就算建立了desc,也是忽略掉。比如對(duì)于以下的查詢,無法發(fā)揮索引的最佳性能。查詢一:selec
MySQL中一條排序語句order by是如何工作的?
MySQL長(zhǎng)期以來對(duì)索引的建立只允許正向asc存儲(chǔ),就算建立了desc,也是忽略掉。
比如對(duì)于以下的查詢,無法發(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è)是反序的。不過在MySQL 8.0 之前的版本都是按照正序來存儲(chǔ)。
按照rank1 正向排序的執(zhí)行計(jì)劃,
按照rank1 反向排序的執(zhí)行計(jì)劃,
從執(zhí)行計(jì)劃來看,反向比正向除了extra里多了Using temporary Using filesort這兩個(gè),其他的一模一樣。這兩個(gè)就代表中間用到了臨時(shí)表和排序,一般來說,凡是執(zhí)行計(jì)劃里用到了這兩個(gè)的,性能幾乎都不咋地。除非我這個(gè)臨時(shí)表不太大,而用于排序的buffer也足夠大,那性能也不至于太差。那這兩個(gè)選項(xiàng)到底對(duì)性能有多大影響呢?
如何從mysql數(shù)據(jù)庫(kù)中查出以日期排序出來的記錄?
Mysql語句是:select * from Product as p order by p.addtime desc limit 6 Hibernate的DAO類中的語句是:from Product as p order by p.addtime desc limit 6
求mysql語句取前100條數(shù)據(jù)做排序在取其中的前5條?
測(cè)試:表名test,字段,id,name select*from(select*fromtestorderbyiddesclimit100)astmplimit5