MySQL高效分頁處理計劃集分享。本站提示廣大學習愛好者:(MySQL高效分頁處理計劃集分享)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL高效分頁處理計劃集分享正文
一,最多見MYSQL最根本的分頁方法:
select * from content order by id desc limit 0, 10
在中小數據量的情形下,如許的SQL足夠用了,獨一須要留意的成績就是確保應用了索引。跟著數據量的增長,頁數會愈來愈多,檢查後幾頁的SQL便可能相似:
select * from content order by id desc limit 10000, 10
一言以蔽之,就是越往後分頁,LIMIT語句的偏移量就會越年夜,速度也會顯著變慢。
此時,我們可以經由過程2種方法:
一,子查詢的分頁方法來進步分頁效力,飄易用的SQL語句以下:
SELECT * FROM `content` WHERE id (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize
為何會如許呢?由於子查詢是在索引上完成的,而通俗的查詢時在數據文件上完成的,平日來講,索引文件要比數據文件小很多,所以操作起來也會更有用率。(via)經由過程explain SQL語句發明:子查詢應用了索引!
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY content range PRIMARY PRIMARY 4 NULL 6264 Using where
2 SUBQUERY content index NULL PRIMARY 4 NULL 27085 Using index
經由飄易的實測,應用子查詢的分頁方法的效力比純LIMIT進步了14-20倍!
二,JOIN分頁方法
select * FROM `content` AS t1
JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2
WHERE t1.id
經由我的測試,join分頁和子查詢分頁的效力根本在一個品級上,消費的時光也根本分歧。explain SQL語句:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY system NULL NULL NULL NULL 1
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where
2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index
三,應用MYSQL的FOUND_ROWS()函數
Mysql FOUND_ROWS() 函數聯合SQL_CALC_FOUND_ROWS在SELECT中可以獲得兩個成果:
1. 獲得Limit的內容
2. 獲得去除Limit今後一切行數
SELECT語句中常常能夠用LIMIT限制前往行數。有時刻能夠想要曉得假如沒有LIMIT會前往若干行,但又不想再履行一次雷同語句。那末,在SELECT查詢中包括SQL_CALC_FOUND_ROWS選項,然後履行FOUND_ROWS()便可以了:
select SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
個中SQL_CALC_FOUND_ROWS 告知Mysql將sql所處置的行數記載上去,FOUND_ROWS() 則取到了這個記載。 固然也是兩個語句,然則只履行了一次主查詢,所以效力比本來要高許多。
1. 假如在前一條語句中應用SQL_CALC_FOUND_ROWS選項,FOUND_ROWS()將前往第一條語句沒有LIMIT時前往的行數。
2. 假如在前一條語句中沒有應用SQL_CALC_FOUND_ROWS選項,FOUND_ROWS()將前往前一條語句現實前往的行數。
假如應用 SELECT SQL_CALC_FOUND_ROWS,MySQL必需盤算一切成果集的行數。雖然如許,總比再履行一次不應用LIMIT的查詢要快多了吧,由於那樣成果集要前往客戶端滴。(別的:應當不單是未將成果集前往的緣由,還有緣由能夠是好比LIKE之類比擬費力的SQL不須要再去勞頓一次。)
-- 留意上面語句中的前提 LIKE
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE Name LIKE '%string%' id > 100 LIMIT 10;
SELECT FOUND_ROWS();
-- 下面語句等價於上面語句,但機能方面應當晉升異常異常的顯著:
SELECT COUNT(*) FROM tbl_name WHERE Name LIKE '%string%' ;
SELECT * FROM tbl_name WHERE Name LIKE '%string%' id > 100 LIMIT 10;