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

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

 更新時間:2016年08月31日 12:25:03   投稿:mdxy-dxy  
自己的一個網站,由于單表的數據記錄高達了一百萬條,造成數據訪問很慢,Google分析的后臺經常報告超時,尤其是頁碼大的頁面更是慢的不行

測試環(huán)境:

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

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

查詢結果:

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

表行數:866633
平均每行的數據長度:5133字節(jié)
單表大小:4448700632字節(jié)

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

測試實驗

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

select * from product limit start, count
當起始頁較小時,查詢沒有性能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執(zhí)行時間(每頁取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秒

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

再看我們取最后一頁記錄的時間
select * from product limit 866613, 20 37.44秒

難怪搜索引擎抓取我們頁面的時候經常會報超時,像這種分頁最大的頁碼頁顯然這種時
間是無法忍受的。

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

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

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

因為利用索引查找有優(yōu)化算法,且數據就在查詢索引上面,不用再去找相關的數據地址了,這樣節(jié)省了很多時間。另外Mysql中也有相關的索引緩存,在并發(fā)高的時候利用緩存就效果更好了。

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

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

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

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

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

其實兩者用的都是一個原理嘛,所以效果也差不多

相關文章

  • MySQL數據庫表約束超詳細講解

    MySQL數據庫表約束超詳細講解

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

    連接MySQL時出現1449與1045異常解決辦法

    這篇文章主要介紹了連接MySQL時出現1449與1045異常解決辦法的相關資料,通過IP鏈接MySQL的時候會出現1499與1054錯誤異常的情況,這里提供解決辦法,需要的朋友可以參考下
    2017-09-09
  • MySql數據庫中的子查詢與高級應用淺析

    MySql數據庫中的子查詢與高級應用淺析

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

    mysql復制表的幾種常用方式

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

    MySQL查看和修改事務隔離級別的實例講解

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

    MySQL分頁技術、6種分頁方法總結

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

    mysql_ssl_rsa_setup的具體使用

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

    MySQL關閉SSL的簡單方法

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

    MySQL存儲過程輸入參數(in),輸出參數(out),輸入輸出參數(inout)

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

    mysql數據庫操作_高手進階常用的sql命令語句大全

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

最新評論