萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql limit速度優化分析

mysql limit速度優化分析

mysql教程數據庫教程的優化是相當重要的。其他最為常用也是最為需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇下降。

  同樣是取10條數據

 

select * from yanxue8_visit limit 10000,10       select * from yanxue8_visit limit 0,10      就不是一個數量級別的。

  網上也很多關於limit的五條優化准則,都是翻譯自mysql手冊,雖然正確但不實用。今天發現一篇文章寫了些關於limit優化的,很不錯。

  文中不是直接使用limit,而是首先獲取到offset的id然後直接使用limit size來獲取數據。根據他的數據,明顯要好於直接使用limit。這裡我具體使用數據分兩種情況進行測試。(測試環境win2033+p4雙核 (3ghz) +4g內存mysqllimit查詢)

  1、offset比較小的時候

 

1.select * from yanxue8_visit limit 10,10     多次運行,時間保持在0.0004-0.0005之間

 

select * from yanxue8_visit where vid >=(      select vid from yanxue8_visit order by vid limit 10,1  ) limit 10     多次運行,時間保持在0.0005-0.0006之間,主要是0.0006

  結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。

  2、offset大的時候

 

select * from yanxue8_visit limit 10000,10     多次運行,時間保持在0.0187左右

 

select * from yanxue8_visit where vid >=(      select vid from yanxue8_visit order by vid limit 10000,1  ) limit 10      多次運行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,後者越優。

  以後要注意改正自己的limit語句,優化一下mysql了

  推薦人評論

  mysql的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇下降。

使用mysql數據庫,需要返回前幾條或者中間某幾行數據,就要使用到mysql中的limit子句。通常我們也是使用limit去實現分頁的。具體語法如下:
  sql代碼
select * from table limit [offset,] rows | rows offset offset   

   select * from table limit [offset,] rows | rows offset offset
 
  limit子句被用於強制select語句返回指定的記錄數。limit接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。注意:初始記錄行的偏移量是0而不是1。
  具體例子:
  sql代碼
select * from table limit 5,10; //檢索記錄行 6-15  

    select * from table limit 5,10; //檢索記錄行 6-15
 
  為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1:
   sql代碼
select * from table limit 75,-1; //檢索記錄行75-last.   

    select * from table limit 75,-1; //檢索記錄行75-last.
  
   如果只給定一個參數,它表示返回最大的記錄行數目:
   sql代碼
//檢索前5個記錄行,換句話說,limit n等價於limit 0,n  
select * from table limit 5; 

 


mysql 不允許對子查詢用limit。


sql = "select * from users " + ps教程ql + " limit " + (pcurrentpage_int - 1) * getpagesize() + "," + getpagesize();
這是我原本的sql 語句.
數據大的時候.性能不是很好.
我就重寫了
這樣

sql = "select * from users " + psql;
               if(psql.length() == 0) {
                  sql += " where id >= (select id from users order by id limit " + (pcurrentpage_int - 1) * getpagesize() + ",1) limit " + getpagesize();
                } else {
                  sql += " and id >= (select id from users " + psql + " order by id limit " + (pcurrentpage_int - 1) * getpagesize() + ",1) limit " + getpagesize();
                }

 

我也遇到過limit的性能問題,但性能的瓶頸是order by上。對*做order by速度非常慢。我的改進是只對id做,查出所需id再去select * from table where id in(idstring);性能提高不少。如果是分頁可以考慮用 sql_calc_found_row . 希望對你有幫助。

select sql_calc_found_row id from table where ------ limit 0,50;
select found_row() ;
兩句一起用可以找出第一條語句的一共有多少符合條件的結果。

copyright © 萬盛學電腦網 all rights reserved