MySQL?原理與優(yōu)化之Limit?查詢優(yōu)化
假設有表tb_sku,其表結構如下:
表中大約有200w條記錄,執(zhí)行如下的sql 語句大約 4.36s 返回數(shù)據(jù)
select count(*) from tb_sku;
接著我們使用 對其進行分頁查找:
select * from tb_sku limit 0,10;
limit 語句 其中0 代表起始位置,10 為每頁返回的數(shù)據(jù)數(shù)量。
如上圖所示,很快就返回了查詢結果。
接著我們再使用SQL 語句
select * from tb_sku limit 10,10;
語句從記錄位置10的位置開始再往下返回10 條記錄,也就是第二頁的信息。其返回時間也是比較快。
然后,我們加大起始位置 到100w如下:
select * from tb_sku limit 1000000,10;
此時返回時間需要0.74 s,這說明了使用limit 對大數(shù)據(jù)量的表進行分頁,位置越靠后效率越低。拿上面的例子來說,limit 會先對 100w 的數(shù)據(jù)進行排序,然后再返回10 條數(shù)據(jù),而且僅僅返回100w 到 100w 零10條 的記錄,其他查詢的記錄都會丟棄掉,這種做法查詢排序的代價非常大。
由此我們需要對大數(shù)據(jù)量表進行l(wèi)imit 操作進行優(yōu)化,官方給出的方案是通過覆蓋索引和子查詢的方式進行優(yōu)化
根據(jù)這個思路首先對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 原理與優(yōu)化之Limit 查詢優(yōu)化的文章就介紹到這了,更多相關MySQL Limit 優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
麒麟系統(tǒng)上安裝?MySQL?8.0.24的詳細步驟(避坑指南)
這篇文章主要介紹了麒麟系統(tǒng)上安裝MySQL8.0.24的詳細步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08實現(xiàn)MySQL數(shù)據(jù)庫鎖的兩種方式
今天我們就來聊一聊數(shù)據(jù)庫的鎖,實現(xiàn)數(shù)據(jù)庫鎖的兩種方式,一個是實現(xiàn)樂觀鎖的方式,一個是實現(xiàn)悲觀鎖的實現(xiàn)方式,文中的代碼示例介紹的非常詳細,需要的朋友可以參考下2023-06-06