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() ;
兩句一起用可以找出第一條語句的一共有多少符合條件的結果。