亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

復制代碼 代碼如下:

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

另外一種是使用SQL_CALC_FOUND_ROWS
復制代碼 代碼如下:

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)缺點:
首先原子性講,第二種肯定比第一種好。第二種能保證查詢語句的原子性,第一種當兩個請求之間有額外的操作修改了表的時候,結果就自然是不準確的了。而第二種則不會。但是非??上В话沩撁嫘枰M行分頁顯示的時候,往往并不要求分頁的結果非常準確。即分頁返回的total總數(shù)大1或者小1都是無所謂的。所以其實原子性不是我們分頁關注的重點。

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

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ù)索引返回結果,而不進行表查詢

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

MySQL之Covering Index

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

實驗
結合這幾篇文章,做的實驗:

表:

復制代碼 代碼如下:

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
復制代碼 代碼如下:

<?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";

返回的結果:

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

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

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

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

相關文章

  • PHP中ID設置自增后不連續(xù)的原因分析及解決辦法

    PHP中ID設置自增后不連續(xù)的原因分析及解決辦法

    這篇文章主要介紹了PHP中ID設置自增后不連續(xù)的原因分析及解決辦法的相關資料,需要的朋友可以參考下
    2016-08-08
  • PHP抽獎算法程序代碼分享

    PHP抽獎算法程序代碼分享

    這篇文章主要分享了PHP抽獎算法程序設計,抽獎在日常生活中大家都會接觸到,用php如何實現(xiàn)抽獎算法,需要了解的朋友可以參考一下
    2015-10-10
  • 解決Laravel5.5下的toArray問題

    解決Laravel5.5下的toArray問題

    今天小編就為大家分享一篇解決Laravel5.5下的toArray問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 一個基于phpQuery的php通用采集類分享

    一個基于phpQuery的php通用采集類分享

    這是自己以前寫的一個php的采集類,自己一直在用,自我感覺很簡單很強大,只要懂一點點選擇器的知識就可以采集任何頁面了,也支持https頁面,做簡單的采集足夠用了
    2014-04-04
  • PHP隨手筆記整理之PHP腳本和JAVA連接mysql數(shù)據(jù)庫

    PHP隨手筆記整理之PHP腳本和JAVA連接mysql數(shù)據(jù)庫

    這篇文章主要介紹了PHP隨手筆記整理之PHP腳本和JAVA連接mysql數(shù)據(jù)庫的相關資料,需要的朋友可以參考下
    2015-11-11
  • 淺談PHP攔截器之__set()與__get()的理解與使用方法

    淺談PHP攔截器之__set()與__get()的理解與使用方法

    下面小編就為大家?guī)硪黄獪\談PHP攔截器之__set()與__get()的理解與使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • yii 框架實現(xiàn)按天,月,年,自定義時間段統(tǒng)計數(shù)據(jù)的方法分析

    yii 框架實現(xiàn)按天,月,年,自定義時間段統(tǒng)計數(shù)據(jù)的方法分析

    這篇文章主要介紹了yii 框架實現(xiàn)按天,月,年,自定義時間段統(tǒng)計數(shù)據(jù)的方法,結合實例形式分析了yii基于自定義時間段統(tǒng)計數(shù)據(jù)的相關操作技巧與使用注意事項,需要的朋友可以參考下
    2020-04-04
  • PHP GC回收機制實例詳解

    PHP GC回收機制實例詳解

    GC的全稱是Garbage Collection也就是垃圾回收的意思,在PHP中,是使用引用計數(shù)和回收周期來自動管理內(nèi)存對象的,當一個對象被設置為NULL,或者沒有任何指針指向時,他就會變成垃圾,被GC機制回收掉,這篇文章主要介紹了PHP GC回收機制詳解 ,需要的朋友可以參考下
    2024-01-01
  • Yii2下session跨域名共存的解決方案

    Yii2下session跨域名共存的解決方案

    這篇文章主要介紹了Yii2下session跨域名共存的解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 百度站點地圖(百度sitemap)生成方法分享

    百度站點地圖(百度sitemap)生成方法分享

    百度目前還沒有開放站點地圖數(shù)據(jù)提交,但可以通過,百度站長工具的開放適配提交更新數(shù)據(jù),大家參考使用吧
    2014-01-01

最新評論