2010-03-20 11 views
28

मैं सोच रहा हूं कि कौन सी विधि सबसे प्रभावी है यदि मैं सचमुच सिर्फ एक तालिका में पंक्तियों की संख्या प्राप्त करना चाहता हूं।एसक्यूएल और PHP - जो तेजी से mysql_num_rows() या 'चयन गिनती()' है?

$res = mysql_query("SELECT count(*) as `number` FROM `table1`"); 
$count = mysql_fetch_result($res,0,'number'); 

या

$res = mysql_query("SELECT `ID` FROM `table1`"); 
$count = mysql_num_rows($res); 

कोई भी इस पर किसी भी सभ्य परीक्षण किया?

उत्तर

30

mysql_query() MySQL से php pcrocess में सभी परिणाम रिकॉर्ड स्थानांतरित करने से पहले स्थानांतरित करता है (mysql_unbufferd_query() के विपरीत)। वह अकेला mysql_num_rows() संस्करण धीमा कर देगा।

इसके अलावा कुछ इंजनों (जैसे MyISAM) के लिए MySQL तालिका without hitting the actual data तालिका के सूचकांक से एक गणना (*) अनुरोध की सेवा कर सकता है। दूसरी ओर SELECT * FROM foo परिणामस्वरूप एक पूर्ण टेबल स्कैन होता है और MySQL को प्रत्येक डेटासेट को पढ़ना होता है।

+0

आपकी पोस्ट के लिए सभी को धन्यवाद, आपको एक चुनना पड़ा। वोल्कर का जवाब निश्चित और जानकारीपूर्ण था। धन्यवाद :) – Joel

0

मुझे लगता है कि count(1) भी तेजी से हो जाएगा: प्रस्तावित तरीकों प्रयास नहीं किया है हालांकि पहले डेटाबेस सभी रिकॉर्ड को लाने और डेटाबेस में उनकी गणना करता है

$res = mysql_query("SELECT count(1) as `number` FROM `table1`"); 
$count = mysql_fetch_result($res,0,'number'); 

,, दूसरा डेटाबेस लाने के लिए एक अलग बनाता है सभी रिकॉर्ड्स के लिए फ़ील्ड और सर्वर पर परिणामों की संख्या गिनें।
अंगूठे के नियम के रूप में आप एक विशेष रिकॉर्ड के लिए प्राप्त होने वाले कम डेटा को कम समय लेते हैं इसलिए मैं अद्यतन पहली विधि (प्रत्येक रिकॉर्ड के लिए स्थिरता लाने और प्राप्त स्थिरांक की संख्या की गणना करने) के लिए वोट दूंगा।

+1

तो भंडारण इंजन MyISAM और वहाँ ई 'जहां भी' स्थितियां नहीं हैं, 'गिनती (*) 'तेज़ी से होगी, क्योंकि सटीक रिकॉर्ड गणना MyISAM तालिकाओं के लिए संग्रहीत की जाती है। –

+1

आपका अनुमान बैकफायर कर सकता है - COUNT (*) परिणाम सेट के आकार को प्राप्त करने का बेवकूफ तरीका है, और इसके नमक के किसी भी डेटाबेस को इसके लिए अनुकूलित किया जाएगा। –

+2

और * गिनती (*) 'में * का अर्थ है "डेटा को न देखें, केवल रिकॉर्ड्स गिनें" गणना के अनुसार (कॉलनाम)। – VolkerK

0

मुझे सच में नहीं लगता कि किसी भी परीक्षण की आवश्यकता है।

SQL क्वेरी

1) में आपके पास COUNT कर भेजता है डेटा का केवल एक पंक्ति ग्राहक के लिए वापस (प्रत्येक पंक्ति के बजाय)

2) की सुविधा देता है एसक्यूएल आप के लिए गिनती करना है जो शायद PHP से तेज होने के लिए हमेशा जा रहा है।

6

निश्चित रूप से पहले। MySQL आमतौर पर पूरे टेबल की बजाय इंडेक्स को देखकर ऐसा कर सकता है, और यदि आप MyISAM (डिफ़ॉल्ट) का उपयोग करते हैं, तो तालिका के लिए पंक्ति गणना टेबल मेटाडेटा में संग्रहीत होती है और तुरंत लौटा दी जाएगी।

आपकी दूसरी विधि न केवल संपूर्ण तालिका को स्मृति में पढ़ेगी बल्कि क्लाइंट को पंक्तियों की गणना करने से पहले इसे नेटवर्क के माध्यम से भी भेज देगा। बेहद अपमानजनक!

-3

इंडेक्स और इनोडब के साथ गणना का उपयोग करना बहुत धीमा हो जाता है, लेकिन जब इसे mysqli_num_rows के साथ उपयोग किया जाता है तो यह बिना किसी देरी के देता है। आप mysqli_num_rows परिणाम http://ssajalandhar.org/generalinstruction-0-1-0.html पर देख सकते हैं, यह लोड करने के लिए दूसरे का अंश नहीं लेगा। मेरे लिए mysqli भयानक काम करता है।

6

अधिक तो 2300000 पंक्तियों, प्रकार के साथ डेटाबेस में टेस्ट: InnoDB, 1 GiB के पास आकार, का उपयोग कर xhprof

test1:

....SELECT COUNT(id) as cnt FROM $table_name....; 
     row= mysqli_fetch_assoc($res2); 
    echo $row['cnt']; 
     //result1: 
     1,144,106 
     1,230,576 
     1,173,449 
     1,163,163 
     1,218,992 

test2:

....SELECT COUNT(*) as cnt FROM $table_name....; 
     row= mysqli_fetch_assoc($res2); 
    echo $row['cnt']; 
//result2: 
1,120,253 
1,118,243 
1,118,852 
1,092,419 
1,081,316 

test3:

....SELECT * FROM $table_name....; 
    echo mysqli_num_rows($res2); 
    //result3: 
7,212,476 
6,530,615 
7,014,546 
7,169,629 
7,295,878 

test4:

 ....SELECT * FROM $table_name....; 
     echo mysqli_num_rows($res2); 
     //result4: 
1,441,228 
1,671,616 
1,483,050 
1,446,315 
1,647,019 

निष्कर्ष: सबसे तेजी से विधि test2 में है:

....SELECT COUNT(*) as cnt FROM $table_name....; 
     row= mysqli_fetch_assoc($res2); 
    echo $row['cnt']; 
संबंधित मुद्दे