一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - Mysql中分頁查詢的兩個解決方法比較

Mysql中分頁查詢的兩個解決方法比較

2020-03-22 18:08MYSQL教程網(wǎng) Mysql

本篇文章介紹了,Mysql中分頁查詢的兩個解決方法比較。需要的朋友參考下

mysql中分頁查詢有兩種方式, 一種是使用COUNT(*)的方式,具體代碼如下 

復(fù)制代碼代碼如下:

SELECT COUNT(*) FROM foo WHERE b = 1; 
SELECT a FROM foo WHERE b = 1 LIMIT 100,10; 


另外一種是使用SQL_CALC_FOUND_ROWS 

復(fù)制代碼代碼如下:

SELECT SQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10; 
SELECT FOUND_ROWS(); 


第二種方式調(diào)用SQL_CALC_FOUND_ROWS之后會將WHERE語句查詢的行數(shù)放在FOUND_ROWS()之中,第二次只需要查詢FOUND_ROWS()就可以查出有多少行了。

 


討論這兩種方法的優(yōu)缺點:
首先原子性講,第二種肯定比第一種好。第二種能保證查詢語句的原子性,第一種當(dāng)兩個請求之間有額外的操作修改了表的時候,結(jié)果就自然是不準(zhǔn)確的了。而第二種則不會。但是非常可惜,一般頁面需要進行分頁顯示的時候,往往并不要求分頁的結(jié)果非常準(zhǔn)確。即分頁返回的total總數(shù)大1或者小1都是無所謂的。所以其實原子性不是我們分頁關(guān)注的重點。

 

下面看效率。這個非常重要,分頁操作在每個網(wǎng)站上的使用都是非常大的,查詢量自然也很大。由于無論哪種,分頁操作必然會有兩次sql查詢,于是就有很多很多關(guān)于兩種查詢性能的比較:

SQL_CALC_FOUND_ROWS真的很慢么?

http://hi.baidu.com/thinkinginlamp/item/b122fdaea5ba23f614329b14

To SQL_CALC_FOUND_ROWS or not to SQL_CALC_FOUND_ROWS?

http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

老王這篇文章里面有提到一個covering index的概念,簡單來說就是怎樣才能只讓查詢根據(jù)索引返回結(jié)果,而不進行表查詢

具體看他的另外一篇文章:

MySQL之Covering Index

http://hi.baidu.com/thinkinginlamp/item/1b9aaf09014acce0f45ba6d3

實驗
結(jié)合這幾篇文章,做的實驗:

表: 

復(fù)制代碼代碼如下:

CREATE TABLE IF NOT EXISTS `foo` ( 
`a` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`b` int(10) unsigned NOT NULL, 
`c` varchar(100) NOT NULL, 
PRIMARY KEY (`a`), 
KEY `bar` (`b`,`a`) 
) ENGINE=MyISAM; 


注意下這里是使用b,a做了一個索引,所以查詢select * 的時候是不會用到covering index的,select a才會使用到covering index

復(fù)制代碼代碼如下:

<?php 

$host = '192.168.100.166'; 
$dbName = 'test'; 
$user = 'root'; 
$password = ''; 

$db = mysql_connect($host, $user, $password) or die('DB connect failed'); 
mysql_select_db($dbName, $db); 

  
echo '==========================================' . "\r\n"; 

$start = microtime(true); 
for ($i =0; $i<1000; $i++) { 
    mysql_query("SELECT SQL_NO_CACHE COUNT(*) FROM foo WHERE b = 1"); 
    mysql_query("SELECT SQL_NO_CACHE a FROM foo WHERE b = 1 LIMIT 100,10"); 

$end = microtime(true); 
echo $end - $start . "\r\n"; 

echo '==========================================' . "\r\n"; 

$start = microtime(true); 
for ($i =0; $i<1000; $i++) { 
    mysql_query("SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10"); 
    mysql_query("SELECT FOUND_ROWS()"); 

$end = microtime(true); 
echo $end - $start . "\r\n"; 

echo '==========================================' . "\r\n"; 

$start = microtime(true); 
for ($i =0; $i<1000; $i++) { 
    mysql_query("SELECT SQL_NO_CACHE COUNT(*) FROM foo WHERE b = 1"); 
    mysql_query("SELECT SQL_NO_CACHE * FROM foo WHERE b = 1 LIMIT 100,10"); 

$end = microtime(true); 
echo $end - $start . "\r\n"; 

echo '==========================================' . "\r\n"; 

$start = microtime(true); 
for ($i =0; $i<1000; $i++) { 
    mysql_query("SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM foo WHERE b = 1 LIMIT 100, 10"); 
    mysql_query("SELECT FOUND_ROWS()"); 

$end = microtime(true); 
echo $end - $start . "\r\n";


返回的結(jié)果:
Mysql中分頁查詢的兩個解決方法比較
和老王里面文章說的是一樣的。第四次查詢SQL_CALC_FOUND_ROWS由于不僅是沒有使用到covering index,也需要進行全表查詢,而第三次查詢COUNT(*),且select * 有使用到index,并沒進行全表查詢,所以有這么大的差別。

 

 

總結(jié)
PS: 另外提醒下,這里是使用MyISAM會出現(xiàn)三和四的查詢差別這么大,但是如果是使用InnoDB的話,就不會有這么大差別了。

所以我得出的結(jié)論是如果數(shù)據(jù)庫是InnoDB的話,我還是傾向于使用SQL_CALC_FOUND_ROWS

結(jié)論:SQL_CALC_FOUND_ROWS和COUNT(*)的性能在都使用covering index的情況下前者高,在沒使用covering index情況下后者性能高。所以使用的時候要注意這個。 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久伊人免费 | 成人国产一区二区 | 女人被爽到呻吟娇喘的视频动态图 | 国产麻豆视频 | 国产传媒天美果冻 | 日剧整部剧护妻狂魔免费观看全集 | 精品国产麻豆免费人成网站 | 天堂在线免费观看 | 日韩一区二区三区四区五区 | 欧美日韩一区二区三区在线视频 | 乌克兰粉嫩摘花第一次 | 国产香蕉久久 | 男女拍拍拍免费视频网站 | 国产女主播在线播放一区二区 | 97色资源| 国产精品制服丝袜白丝www | 97久久天天综合色天天综合色hd | 男女羞羞的视频 | 精品国产一二三区在线影院 | 美女被狂揉下部羞羞动漫 | 俺去俺来也在线www色官网 | 亚洲热影院 | 91香蕉视频网址 | 亚洲国产精品成 | 91东航翘臀女神在线播放 | 99久久精品免费观看区一 | 欧美色阁| 每天都要睡男人(nph) | 天天爱天天做天天爽天天躁 | 国产精品短视频 | 日本天堂视频在线观看 | 插鸡网站 | melody中文字幕 | 日本三级欧美三级人妇英文 | 特黄a大片免费视频 | 精品久久久久香蕉网 | 日韩亚洲人成在线 | 红怡院欧洲 | ass亚洲熟妇毛茸茸pics | 亚洲国产精品日韩高清秒播 | 国产午夜免费秋霞影院 |