दिखाता है कि यहां एक सरल परीक्षण है जिसे मैं प्रदर्शन दंड का त्वरित विचार प्राप्त करने के लिए चला गया था, जिसे मैं सीधे क्वेरी का उपयोग करके MySQL PDO तैयार कथन बनाम उपयोग करने के लिए भुगतान करता हूं। व्यक्ति तालिका में 2801 पंक्तियां हैं। MySQL संस्करण 5.5.28 और PHP संस्करण 5.3.15। वेनिला इंस्टॉलेशन, जो भी डिफ़ॉल्ट पैरामीटर हैं। टेस्ट 8 जीबी के साथ आईमैक पर चलते हैं।MySQL पीडीओ क्वेरी से तेज़ी से तैयार है? यही सरल परीक्षण
query: 21.010436058044
prepare/execute: 20.74036192894
जिस पर सभी पर कोई जुर्माना नहीं दिखाता है:
$pdo = new PDO('mysql:host=localhost;dbname=cwadb_local', 'root', "");
$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
$pdo->query("select * from person where name_last = 'smith' or true");
}
echo "<p>query: " . (microtime(true) - $start);
$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
$stmt = $pdo->prepare("select * from person where name_last = :last or true");
$stmt->execute(array('last' => 'smith'));
}
echo "<p>prepare/execute: " . (microtime(true) - $start);
और इस उत्पादन किया गया था। संभावनाएं:
तैयार कथन का कैशिंग वास्तव में काम कर रहा है। (नोटिस मैंने लूप के अंदर तैयार फ़ंक्शन रखा है।)
यह एक फर्जी परीक्षण है क्योंकि यह बहुत आसान है।
कोई सैद्धांतिक कारण नहीं है कि क्यों तैयार/निष्पादन धीमा होना चाहिए, और निरंतर आलोचनाओं से थक गए, MySQL/PDO/PHP डेवलपर्स ने हमें सभी को चुप रहने के प्रयास में तेज़ी से काम करने के लिए अतिरिक्त मेहनत की है। ।
अन्य?
यह कई बार कहा गया है कि तैयार बयान का उपयोग कर (mysqli उन्हें नहीं है) क्वेरी का उपयोग और, पीडीओ में नामित मानकों के साथ, मानकों के साथ काम कर बहुत सुविधाजनक है की तुलना में अधिक सुरक्षित है। लेकिन, यह अक्सर ध्यान दिया जाता है कि प्रत्येक बार निष्पादित होने पर कथन तैयार होने पर प्रदर्शन दंड होता है।
तो, क्या कोई मेरे परीक्षण के विपरीत कुछ परीक्षणों की आपूर्ति कर सकता है? या, क्या हम अभी स्वीकार करेंगे कि तैयार वक्तव्यों का उपयोग न करने का कोई कारण नहीं है?
1) बहुत बढ़िया 2) हां 3) "कौन परवाह करता है?" - तैयार बयान का प्रयोग करें। –
बस इसके लिए, अधिक प्रश्नों के साथ इसे फिर से चलाने का प्रयास करें और ऑर्डर को स्वैप करने का प्रयास करें (पहले तैयार)। – Supericy
मैंने सोचा होगा कि तैयार कथन सीधे प्रश्नों की तुलना में _faster_ होने की उम्मीद है, इस आधार पर कि तैयार कथन में एसक्यूएल हर बार समान होता है। यह क्वेरी सर्वर को डेटाबेस सर्वर में कैश करने की अनुमति देता है, जो संभव नहीं है यदि आप निरंतर गैर-तैयार 'WHERE' खंड बदल रहे हैं। – halfer