關於分頁的優化相信很多部落格裡都有描述,原理都是一樣的。比如大多數舉的例子:
select * from t1 limit 10000,10;可以轉換成
select * from t1 where id>=(select id from t1 limit 10000,1) limit 10;
id為主鍵,這樣直接先查id,因為是索引覆蓋的查詢方式,所以很快。
但是根據id有乙個問題,如果你的主鍵id不是自增的,或者中間有很多資料被刪除了,然後又插入了新的資料。這樣自增的順序可能會被打亂,再這樣去查詢會不會查詢的結果不對。又或者說類似於新聞文章這樣的資料,我們是按照發布時間降序排序的,不是按照id。又該怎麼優化新聞分頁查詢sql呢,首先先貼上下新聞欄目分頁查詢的sql:
select
`phpcms_a`.`id`,
`phpcms_a`.`title`,
`phpcms_a`.`description`,
`phpcms_a`.`thumb`,
`phpcms_a`.`inputtime`,
`phpcms_a`.`is_recommend`,
`phpcms_a`.`recommend_date`,
`phpcms_b`.`icon`,
`phpcms_c`.`news_view_priv`,
`phpcms_c`.`news_view_start`,
`phpcms_c`.`news_view_end`
from
`phpcms_news` as `phpcms_a`
left join `phpcms_mc_news_type` as `phpcms_b` on `phpcms_a`.`news_typeid` = `phpcms_b`.`id`
left join `phpcms_news_data` as `phpcms_c` on `phpcms_a`.`id` = `phpcms_c`.`id`
where
`phpcms_a`.`status` = 99
and `phpcms_a`.`inputtime` >= 1459440000
and `phpcms_a`.`inputtime` <= 1475251199
and `phpcms_a`.`catid` = 12
and `phpcms_a`.`inputtime` <= (
select
`inputtime`
from
`phpcms_news`
where
`catid` = 12
and `status` = 99
and `inputtime` >= 1459440000
and `inputtime` <= 1475251199
order by
`inputtime` desc
limit 1 offset 0
)order by
`phpcms_a`.`inputtime` desc
limit 20
這裡主要有四張表關聯,where後有多個查詢條件,並且最後是按照發布時間inputtime降序排列的,針對這個分頁查詢,如果按照上面所描述的,我們應該如上面sql所寫的一樣,通過inputtime<=(select inputtime ...來優化分頁查詢,並且分頁查詢裡的條件需要跟外層where後的條件保持一致。然後我們建個聯合索引比如idx_c(catid,status,inputtime)。explain分析下這個sql結果如下:
我們來看下,這個查詢還是蠻優的吧, 十幾萬的資料幾十毫秒就能查出來了。
解決的方式是我們可以額外建乙個字段比如說displayorder bigint(13),這個欄位的值預設等於inputtime*1000,如果出現重**布時間,那麼我們在儲存資料的時候,寫乙個程式,給重複的發布時間後面加上001,這樣子的話相同發布時間的文章對應的displayorder欄位就是inputtime000,inputtime001,inputtime002....,這樣子的話按照displayorder排序就可以了,inputtime<=換成displayorder<=,索引idx_c修改為idx_c(catid,status,displayorder)。這樣就避免了發布時間相同導致的分頁查詢出現資料重複的問題。又能保證效率。
分頁查詢優化
1 子查詢優化法 先找出第一條資料,然後大於等於這條資料的id就是要獲取的資料 缺點 資料必須是連續的,可以說不能有where條件,where條件會篩選資料,導致資料失去連續性。實驗下 如下 複製 mysql set profiling 1 query ok,0 rows affected 0.00...
分頁查詢優化
自己的乙個 由於單錶的資料記錄高達了一百萬條,造成資料訪問很慢,google分析的後台經常報告超時,尤其是頁碼大的頁面更是慢的不行。先讓我們熟悉下基本的sql語句,來檢視下我們將要測試表的基本資訊 use infomation schema select from tables where tabl...
mysql 分頁優化 Mysql 查詢分頁優化
全表掃瞄,速度極慢 limit 語句的查詢時間與起始記錄的位置成正比 mysql 的 limit 語句是很方便,但是對記錄很多的表並不適合直接使用 建立測試表 drop table if exists t user create table test t user id int 10 unsigne...