以下2個sql語句,執行時間同樣。 由於查詢字段id被索引覆蓋。mysql
select id from order_manage where create_time > '2014-01-01' order by create_time desc limit 100000,10 select a.id from order_manage a inner join ( select id from order_manage where create_time > '2014-01-01' order by create_time desc limit 1000,10) b on a.id = b.id
以下2條sql,使用inner join要快一個數量級。 inner join影響結果集仍然是$start +30,可是數據獲取的過程(Sending data狀態)發生在索引文件中,而不是數據表文件,這樣所須要的系統開銷就比前一種普通的查詢低一個數量級,而主查詢的影響結果集只有30條,幾乎無開銷。可是切記,這裏仍然涉及了太多的影響結果集操做sql
其實也能夠分紅2條sql語句來作,第一條使用覆蓋索引查詢出id,在使用in查詢出須要的字段數據。數據結構
select * from order_manage where create_time > '2014-01-01' order by create_time desc limit 100000,10 select * from order_manage a inner join ( select id from order_manage where create_time > '2014-01-01' order by create_time desc limit 1000,10) b on a.id = b.id
每次查詢的時候將該頁查詢結果中最大的 $lastpost和最小的分別記錄爲 $minlastpost 和 $maxlastpostpost
上翻頁查詢爲 select * from post where tagid=$tagid and lastpost<$minlastpost order by lastpost desc limit 30; 下翻頁爲 select * from post where tagid=$tagid and lastpost>$maxlastpost order by lastpost limit 30; 使用這種方式,影響結果集只有30條,效率極大提高。
以下sql :大數據
select * from user where area=’$area’ and sex=’$sex’ order by lastlogin desc limit 0,30;
創建複合索引並, area+sex+lastlogin 三個字段的複合索引(注意順序),order by的字段要在最後。where條件字段,惟一性最好的要在最前。優化
Area+sex+lastlogin複合索引時(切記lastlogin在最後),該索引基於area+sex+lastlogin 三個字段合併的結果排序。複合索引的使用是符合左邊原則。a,b,c的複合索引
abc,ab,a,可使用索引,其餘狀況都不能使用索引。
複合索引的使用原則是第一個條件應該是複合索引的第一列必須使用,而且不能誇列。ac是不能使用索引的。code