欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL分頁優(yōu)化

 更新時間:2016年04月20日 14:47:44   作者:iVictor  
這篇文章主要為大家詳細(xì)介紹了MySQL分頁優(yōu)化,內(nèi)容思路很詳細(xì),有意對MySQL分頁優(yōu)化的朋友可以參考一下

最近,幫同事重寫了一個MySQL SQL語句,該SQL語句涉及兩張表,其中一張表是字典表(需返回一個字段),另一張表是業(yè)務(wù)表(本身就有150個字段,需全部返回),當(dāng)然,字段的個數(shù)是否合理在這里不予評價。平時,返回的數(shù)據(jù)大概5w左右,系統(tǒng)尚能收到數(shù)據(jù)。但12月31日那天,數(shù)據(jù)量大概20w,導(dǎo)致SQL執(zhí)行時間過長,未能在規(guī)定的時間內(nèi)反饋結(jié)果,于是系統(tǒng)直接報錯。

一般的思路是用MySQL的分頁功能,即直接在原SQL語句后面增加LIMIT子句。但請注意,雖然你看到的反饋結(jié)果只是LIMIT后面指定的數(shù)量,于是想當(dāng)然的以為MySQL只是檢索了指定數(shù)量的數(shù)據(jù),然后給予返回。其實,MySQL內(nèi)部實現(xiàn)的原理是,檢索所有符合where條件的記錄,然后返回指定數(shù)量的記錄。從這個角度來看,直接在原SQL語句后面添加LIMIT子句只能說是一種可以實現(xiàn)功能的方案,但未必最優(yōu)。

具體在本例中,首先我們來看一下150個字段的表的統(tǒng)計信息:

一行大概就占2k,而Innodb默認(rèn)頁的大小為16k,這意味著,一個頁中最多可存儲8行的數(shù)據(jù)。隨機讀的可能性大大增加。而這無疑會對數(shù)據(jù)庫系統(tǒng)的IO造成極大的壓力。 

優(yōu)化前

如果采用上述方案,即直接在原SQL語句后面增加LIMIT子句,下面,我們來看看它的執(zhí)行情況。

首先,直接添加LIMIT子句后的SQL語句如下(已省略a1表的150個字段和a2中的一個字段):

復(fù)制代碼 代碼如下:
FROM upay_csys_scquery_txn_log_his a1  LEFT JOIN upay_csys_trans_code a2 on(a1.int_trans_code=a2.trans_code) WHERE STATUS<>'00' AND settle_date=20151230 limit 50000,10000;

其執(zhí)行時間如下:

大概執(zhí)行了32s,絕大部分都花費到Sending data上了。Sending data指的是服務(wù)器檢索數(shù)據(jù),讀取數(shù)據(jù),并將數(shù)據(jù)返回給客戶端的時間。

關(guān)于上述執(zhí)行結(jié)果,有以下幾點需要說明:

1. 這是SQL語句多次執(zhí)行后的結(jié)果,這樣就可以排除結(jié)果緩存的影響,事實上,每次查詢的時長都是32s左右。

2. 為什么選用的是limit 50000,10000,而不是0,10000,這個主要是考慮到對于LIMIT子句來說,越到后面,分頁的成本越高?;诖?,選擇了中間值來作為分頁的結(jié)果。

該語句的執(zhí)行計劃如下:

優(yōu)化后:

優(yōu)化的思路:

只對該表的主鍵進行分頁,然后用返回的主鍵作為子查詢的結(jié)果,來檢索該表其它字段的值。

改寫后的SQL語句如下:

復(fù)制代碼 代碼如下:
FROM upay_csys_scquery_txn_log_his a1  LEFT JOIN upay_csys_trans_code a2 on(a1.int_trans_code=a2.trans_code) where seq_id in (select seq_id from (select seq_id FROM upay_csys_scquery_txn_log_his a1  WHERE STATUS<>'00' AND settle_date=20151230 order by 1 limit 50000,10000) as t);

其執(zhí)行時間如下:

大概3s多,比第一種方案快了差不多10倍,效果顯著。

下面來看看其執(zhí)行計劃(explain extended)

 總結(jié):

1. 改寫后的語句原本如下:

復(fù)制代碼 代碼如下:
FROM upay_csys_scquery_txn_log_his a1  LEFT JOIN upay_csys_trans_code a2 on(a1.int_trans_code=a2.trans_code) where seq_id in (select seq_id FROM upay_csys_scquery_txn_log_his a1  WHERE STATUS<>'00' AND settle_date=20151230 order by 1 limit 50000,10000);

但MySQL報以下錯誤:

復(fù)制代碼 代碼如下:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

需再增加一個嵌套子查詢,

比如這樣的語句是不能正確執(zhí)行的。

復(fù)制代碼 代碼如下:
select * from table where id in (select id from table limit 12);

但是,只要你再加一層就行。如:

復(fù)制代碼 代碼如下:
select * from table where id in (select t.id from (select * from table limit 12)as t)

這樣就可以繞開limit子查詢的問題。
問題解決。

2. 如果想查看MySQL查詢優(yōu)化器等價改寫后的SQL語句,可首先通過explain extended得到具體的執(zhí)行計劃,然后通過show warnings查看。

具體在本例中,等價改寫后的SQL語句如下:

與設(shè)想中的執(zhí)行順序一致~

3. 如何查看MySQL語句各步驟的執(zhí)行時間。

以上就是本文的全部內(nèi)容,希望對大家MySQL分頁優(yōu)化有所幫助。

相關(guān)文章

  • mysql復(fù)制data文件遷移的實現(xiàn)步驟

    mysql復(fù)制data文件遷移的實現(xiàn)步驟

    有時候,我們需要遷移整個數(shù)據(jù)庫,包括數(shù)據(jù)文件,本文將介紹如何通過復(fù)制MySQL的data文件來完成數(shù)據(jù)庫遷移,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • MySQL 主從同步,事務(wù)回滾的實現(xiàn)原理

    MySQL 主從同步,事務(wù)回滾的實現(xiàn)原理

    這篇文章主要介紹了MySQL 主從同步,事務(wù)回滾的實現(xiàn)原理,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-12-12
  • 淺談MySQL和Lucene索引的對比分析

    淺談MySQL和Lucene索引的對比分析

    下面小編就為大家?guī)硪黄狹ySQL和Lucene索引的對比分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • MySQL 5.7.27下載安裝配置的詳細(xì)教程

    MySQL 5.7.27下載安裝配置的詳細(xì)教程

    這篇文章主要介紹了MySQL 5.7.27詳細(xì)下載安裝配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • mysql 強大的trim() 函數(shù)

    mysql 強大的trim() 函數(shù)

    這篇文章主要介紹了mysql 強大的trim() 函數(shù)使用方法,需要的朋友可以參考下
    2014-03-03
  • 小型Drupal數(shù)據(jù)庫備份以及大型站點MySQL備份策略分享

    小型Drupal數(shù)據(jù)庫備份以及大型站點MySQL備份策略分享

    為了防止web服務(wù)器出現(xiàn)故障而引起的數(shù)據(jù)丟失,數(shù)據(jù)庫備份顯得非常重要,以免出現(xiàn)重大損失。本文分析研究一下小型的Drupal站的備份策略以及大型站點的mysql備份策略
    2014-11-11
  • MYSQL設(shè)置觸發(fā)器權(quán)限問題的解決方法

    MYSQL設(shè)置觸發(fā)器權(quán)限問題的解決方法

    這篇文章主要介紹了MYSQL設(shè)置觸發(fā)器權(quán)限問題的解決方法,需要的朋友可以參考下
    2014-09-09
  • 一文弄懂MySQL索引創(chuàng)建原則

    一文弄懂MySQL索引創(chuàng)建原則

    在關(guān)鍵字段的索引上建與不建索引,查詢速度相差近100倍,但差的索引和沒有索引效果一樣,索引并非越多越好,因為維護索引需要成本,下面這篇文章主要給大家介紹了關(guān)于MySQL索引創(chuàng)建原則的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • MySQL5.7的安裝與配置詳細(xì)操作步驟

    MySQL5.7的安裝與配置詳細(xì)操作步驟

    本文分步驟詳細(xì)給大家介紹了MySQL5.7的安裝與配置詳細(xì)操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • MySQL 實現(xiàn)lastInfdexOf的功能案例

    MySQL 實現(xiàn)lastInfdexOf的功能案例

    這篇文章主要介紹了MySQL 實現(xiàn)lastInfdexOf的功能案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論