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

MySQL單表百萬數(shù)據(jù)記錄分頁性能優(yōu)化技巧

 更新時(shí)間:2016年08月31日 12:25:03   投稿:mdxy-dxy  
自己的一個(gè)網(wǎng)站,由于單表的數(shù)據(jù)記錄高達(dá)了一百萬條,造成數(shù)據(jù)訪問很慢,Google分析的后臺經(jīng)常報(bào)告超時(shí),尤其是頁碼大的頁面更是慢的不行

測試環(huán)境:

先讓我們熟悉下基本的sql語句,來查看下我們將要測試表的基本信息

use infomation_schema
SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname' AND TABLE_NAME = ‘product'

查詢結(jié)果:

從上圖中我們可以看到表的基本信息:

表行數(shù):866633
平均每行的數(shù)據(jù)長度:5133字節(jié)
單表大?。?448700632字節(jié)

關(guān)于行和表大小的單位都是字節(jié),我們經(jīng)過計(jì)算可以知道
平均行長度:大約5k
單表總大?。?.1g
表中字段各種類型都有varchar、datetime、text等,id字段為主鍵

測試實(shí)驗(yàn)

1. 直接用limit start, count分頁語句, 也是我程序中用的方法:

select * from product limit start, count
當(dāng)起始頁較小時(shí),查詢沒有性能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執(zhí)行時(shí)間(每頁取20條), 如下:

select * from product limit 10, 20  0.016秒
select * from product limit 100, 20  0.016秒
select * from product limit 1000, 20  0.047秒
select * from product limit 10000, 20  0.094秒

我們已經(jīng)看出隨著起始記錄的增加,時(shí)間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關(guān)系的,那么我們把起始記錄改為40w看下(也就是記錄的一般左右) select * from product limit 400000, 20 3.229秒

再看我們?nèi)∽詈笠豁撚涗浀臅r(shí)間
select * from product limit 866613, 20 37.44秒

難怪搜索引擎抓取我們頁面的時(shí)候經(jīng)常會(huì)報(bào)超時(shí),像這種分頁最大的頁碼頁顯然這種時(shí)
間是無法忍受的。

從中我們也能總結(jié)出兩件事情:
1)limit語句的查詢時(shí)間與起始記錄的位置成正比
2)mysql的limit語句是很方便,但是對記錄很多的表并不適合直接使用。

2. 對limit分頁問題的性能優(yōu)化方法

利用表的覆蓋索引來加速分頁查詢
我們都知道,利用了索引查詢的語句中如果只包含了那個(gè)索引列(覆蓋索引),那么這種情況會(huì)查詢很快。

因?yàn)槔盟饕檎矣袃?yōu)化算法,且數(shù)據(jù)就在查詢索引上面,不用再去找相關(guān)的數(shù)據(jù)地址了,這樣節(jié)省了很多時(shí)間。另外Mysql中也有相關(guān)的索引緩存,在并發(fā)高的時(shí)候利用緩存就效果更好了。

在我們的例子中,我們知道id字段是主鍵,自然就包含了默認(rèn)的主鍵索引?,F(xiàn)在讓我們看看利用覆蓋索引的查詢效果如何:

這次我們之間查詢最后一頁的數(shù)據(jù)(利用覆蓋索引,只包含id列),如下:
select id from product limit 866613, 20 0.2秒
相對于查詢了所有列的37.44秒,提升了大概100多倍的速度

那么如果我們也要查詢所有列,有兩種方法,一種是id>=的形式,另一種就是利用join,看下實(shí)際情況:

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
查詢時(shí)間為0.2秒,簡直是一個(gè)質(zhì)的飛躍啊,哈哈

另一種寫法
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
查詢時(shí)間也很短,贊!

其實(shí)兩者用的都是一個(gè)原理嘛,所以效果也差不多

相關(guān)文章

  • MySQL數(shù)據(jù)庫表約束超詳細(xì)講解

    MySQL數(shù)據(jù)庫表約束超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫表約束的相關(guān)資料,MySQL?約束是用于保持?jǐn)?shù)據(jù)完整性和一致性的規(guī)則,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 連接MySQL時(shí)出現(xiàn)1449與1045異常解決辦法

    連接MySQL時(shí)出現(xiàn)1449與1045異常解決辦法

    這篇文章主要介紹了連接MySQL時(shí)出現(xiàn)1449與1045異常解決辦法的相關(guān)資料,通過IP鏈接MySQL的時(shí)候會(huì)出現(xiàn)1499與1054錯(cuò)誤異常的情況,這里提供解決辦法,需要的朋友可以參考下
    2017-09-09
  • MySql數(shù)據(jù)庫中的子查詢與高級應(yīng)用淺析

    MySql數(shù)據(jù)庫中的子查詢與高級應(yīng)用淺析

    這篇文章主要給大家介紹了關(guān)于MySql數(shù)據(jù)庫中子查詢與高級應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • mysql復(fù)制表的幾種常用方式

    mysql復(fù)制表的幾種常用方式

    這篇文章主要給大家介紹了關(guān)于MySQL中復(fù)制表的幾種常用方式,我們在對一張表進(jìn)行操作,但是怕誤刪數(shù)據(jù),所以在同一個(gè)數(shù)據(jù)庫中建一個(gè)表結(jié)構(gòu)一樣,表數(shù)據(jù)也一樣的表,以作備份,需要的朋友可以參考下
    2023-08-08
  • MySQL查看和修改事務(wù)隔離級別的實(shí)例講解

    MySQL查看和修改事務(wù)隔離級別的實(shí)例講解

    在本篇文章里小編給大家整理的是關(guān)于MySQL查看和修改事務(wù)隔離級別的實(shí)例講解,有興趣的朋友們學(xué)習(xí)下。
    2020-03-03
  • MySQL分頁技術(shù)、6種分頁方法總結(jié)

    MySQL分頁技術(shù)、6種分頁方法總結(jié)

    這篇文章主要介紹了MySQL分頁技術(shù)、6種分頁方法總結(jié),本文總結(jié)了6種分頁的方法并分別一一講解它們的特點(diǎn),需要的朋友可以參考下
    2015-07-07
  • mysql_ssl_rsa_setup的具體使用

    mysql_ssl_rsa_setup的具體使用

    mysql_ssl_rsa_setup?是一個(gè)MySQL附帶的工具,用于自動(dòng)創(chuàng)建SSL證書和密鑰文件,本文主要介紹了mysql_ssl_rsa_setup的具體使用,感興趣的可以了解一下
    2024-07-07
  • MySQL關(guān)閉SSL的簡單方法

    MySQL關(guān)閉SSL的簡單方法

    這篇文章主要介紹了MySQL關(guān)閉SSL的簡單方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • MySQL存儲過程輸入?yún)?shù)(in),輸出參數(shù)(out),輸入輸出參數(shù)(inout)

    MySQL存儲過程輸入?yún)?shù)(in),輸出參數(shù)(out),輸入輸出參數(shù)(inout)

    這篇文章主要介紹了MySQL存儲過程輸入?yún)?shù)(in),輸出參數(shù)(out),輸入輸出參數(shù)(inout),存儲過程就是一組SQL語句集,功能強(qiáng)大,可以實(shí)現(xiàn)一些比較復(fù)雜的邏輯功能,類似于JAVA語言中的方法;Python里面的函數(shù)
    2022-07-07
  • mysql數(shù)據(jù)庫操作_高手進(jìn)階常用的sql命令語句大全

    mysql數(shù)據(jù)庫操作_高手進(jìn)階常用的sql命令語句大全

    mysql數(shù)據(jù)庫操作sql命令語句大全:三表連表查詢、更新時(shí)批量替換字段部分字符、判斷某一張表是否存在、自動(dòng)增長恢復(fù)從1開始、查詢重復(fù)記錄、更新時(shí)字段值等于原值加上一個(gè)字符串、更新某字段為隨機(jī)值、復(fù)制表數(shù)據(jù)到另一個(gè)表、創(chuàng)建表時(shí)拷貝其他表的數(shù)據(jù)和結(jié)構(gòu)...
    2022-11-11

最新評論