最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql中分頁(yè)查詢的兩個(gè)解決方法比較

 更新時(shí)間:2013年05月02日 10:04:01   作者:  
本篇文章介紹了,Mysql中分頁(yè)查詢的兩個(gè)解決方法比較。需要的朋友參考下

mysql中分頁(yè)查詢有兩種方式, 一種是使用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之后會(huì)將WHERE語(yǔ)句查詢的行數(shù)放在FOUND_ROWS()之中,第二次只需要查詢FOUND_ROWS()就可以查出有多少行了。


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

下面看效率。這個(gè)非常重要,分頁(yè)操作在每個(gè)網(wǎng)站上的使用都是非常大的,查詢量自然也很大。由于無(wú)論哪種,分頁(yè)操作必然會(huì)有兩次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/

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

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

MySQL之Covering Index

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

實(shí)驗(yàn)
結(jié)合這幾篇文章,做的實(shí)驗(yàn):

表:

復(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做了一個(gè)索引,所以查詢select * 的時(shí)候是不會(huì)用到covering index的,select a才會(huì)使用到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é)果:

和老王里面文章說(shuō)的是一樣的。第四次查詢SQL_CALC_FOUND_ROWS由于不僅是沒(méi)有使用到covering index,也需要進(jìn)行全表查詢,而第三次查詢COUNT(*),且select * 有使用到index,并沒(méi)進(jìn)行全表查詢,所以有這么大的差別。

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

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

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

相關(guān)文章

  • 利用PHPStorm如何開發(fā)Laravel應(yīng)用詳解

    利用PHPStorm如何開發(fā)Laravel應(yīng)用詳解

    這篇文章主要給大家介紹了關(guān)于利用PHPStorm如何開發(fā)Laravel應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-08-08
  • yii2.0整合阿里云oss上傳單個(gè)文件的示例

    yii2.0整合阿里云oss上傳單個(gè)文件的示例

    本篇文章主要介紹了yii2.0整合阿里云oss上傳單個(gè)文件的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 解決php擴(kuò)展安裝不生效問(wèn)題

    解決php擴(kuò)展安裝不生效問(wèn)題

    這篇文章主要介紹了解決php擴(kuò)展安裝不生效問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • PHP數(shù)組實(shí)際占用內(nèi)存大小原理解析

    PHP數(shù)組實(shí)際占用內(nèi)存大小原理解析

    這篇文章主要介紹了PHP數(shù)組實(shí)際占用內(nèi)存大小原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • ThinkPHP3.2.3數(shù)據(jù)庫(kù)設(shè)置新特性

    ThinkPHP3.2.3數(shù)據(jù)庫(kù)設(shè)置新特性

    前篇文章,我們總結(jié)了下ThinkPHP3.2中所產(chǎn)生的新變化,本文我們來(lái)詳細(xì)看下關(guān)于數(shù)據(jù)庫(kù)這塊有哪些新特性,非常細(xì)致,有需要的小伙伴參考下。
    2015-03-03
  • laravel使用Redis實(shí)現(xiàn)網(wǎng)站緩存讀取的方法詳解

    laravel使用Redis實(shí)現(xiàn)網(wǎng)站緩存讀取的方法詳解

    這篇文章主要給大家介紹了關(guān)于laravel使用Redis實(shí)現(xiàn)網(wǎng)站緩存讀取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • PHP中常見的錯(cuò)誤與異常處理總結(jié)大全

    PHP中常見的錯(cuò)誤與異常處理總結(jié)大全

    任何程序員在開發(fā)時(shí)都可能遇到過(guò)一些失誤,或其他原因造成錯(cuò)誤的發(fā)生。當(dāng)然,用戶如果不愿意或不遵循應(yīng)用程序的約束,也會(huì)在使用時(shí)引起一些錯(cuò)誤發(fā)生。下面這篇文章主要給大家介紹了關(guān)于PHP中常見的錯(cuò)誤與異常處理,需要的朋友可以參考下,
    2017-08-08
  • 命令行執(zhí)行php腳本中的$argv和$argc配置方法

    命令行執(zhí)行php腳本中的$argv和$argc配置方法

    這篇文章主要介紹了命令行執(zhí)行php腳本 中$argv和$argc的方法,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-01-01
  • phpstudy本地環(huán)境搭建超詳細(xì)圖文教程

    phpstudy本地環(huán)境搭建超詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于phpstudy本地環(huán)境搭建超詳細(xì)圖文教程的相關(guān)資料,phpStudy是集安全、高效、功能于一體且完全免費(fèi)的一鍵服務(wù)器環(huán)境搭建軟件,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Thinkphp搜索時(shí)首頁(yè)分頁(yè)和搜索頁(yè)保持條件分頁(yè)的方法

    Thinkphp搜索時(shí)首頁(yè)分頁(yè)和搜索頁(yè)保持條件分頁(yè)的方法

    這篇文章主要介紹了Thinkphp搜索時(shí)首頁(yè)分頁(yè)和搜索頁(yè)保持條件分頁(yè)的方法,以兩種不同的方式詳細(xì)分析了實(shí)現(xiàn)搜索時(shí)分頁(yè)情況下保持搜索條件的方法,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

涟水县| 视频| 嘉义县| 光泽县| 蒙山县| 敦煌市| 锦屏县| 贺州市| 金溪县| 旌德县| 津南区| 益阳市| 五常市| 马边| 胶州市| 伊金霍洛旗| 井冈山市| 茂名市| 明光市| 盐亭县| 碌曲县| 北票市| 南溪县| 景东| 辽阳市| 罗源县| 彭州市| 丁青县| 东乡| 新民市| 北票市| 保定市| 香港 | 格尔木市| 鸡东县| 福安市| 汉寿县| 博罗县| 阳新县| 界首市| 巴楚县|