MySQL 原理與優化之Limit 查詢優化

假設有表tb_sku,其表結構如下:

表中大約有200w條記錄,執行如下的sql 語句大約 4.36s 返回數據

select count(*) from tb_sku;

接著我們使用 對其進行分頁查找:

select * from tb_sku limit 0,10;

limit 語句 其中0 代表起始位置,10 為每頁返回的數據數量。

如上圖所示,很快就返回瞭查詢結果。

接著我們再使用SQL 語句

select * from tb_sku limit 10,10;

語句從記錄位置10的位置開始再往下返回10 條記錄,也就是第二頁的信息。其返回時間也是比較快。

然後,我們加大起始位置 到100w如下:

select * from tb_sku limit 1000000,10;

此時返回時間需要0.74 s,這說明瞭使用limit 對大數據量的表進行分頁,位置越靠後效率越低。拿上面的例子來說,limit 會先對 100w 的數據進行排序,然後再返回10 條數據,而且僅僅返回100w 到 100w 零10條 的記錄,其他查詢的記錄都會丟棄掉,這種做法查詢排序的代價非常大。

由此我們需要對大數據量表進行limit 操作進行優化,官方給出的方案是通過覆蓋索引和子查詢的方式進行優化

根據這個思路首先對id 進行查詢:

select id from tb_sku order by id limit 1000000,10;

查詢結果就隻需要0.34s 比之前的0.74s要快多瞭。究其原因,因為直接返回id的信息,並沒有進行回表操作,所以速度別select * 要快

由於我們需要獲得select * 的信息,也就是tb_user 所有字段的信息,因此需要將上面的查詢結果和tb_user 進行jion 操作。

select s.* from tb_sku s ,(select id from tb_sku order by id limit 1000000,10 ) t where s.id = t.id;

這裡通過查詢id 和子查詢 的方式將查詢結果縮短為 0.38s,比之前直接通過 select * 的方式要縮短一倍的查詢時間。

到此這篇關於MySQL 原理與優化之Limit 查詢優化的文章就介紹到這瞭,更多相關MySQL Limit 優化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: