2011-06-22 30 views
15

मैं MYSQL क्वेरी चलाने के लिए PHP में पीडीओ ऑब्जेक्ट का उपयोग कर रहा हूं, और मैं इसे तेज करने के लिए क्वेरी पर काम करने की कोशिश कर रहा हूं। क्वेरी इस प्रकार, के रूप में मेरे PHP फ़ाइल में देखा जाता है:

पीडीओ mysql क्वेरी से बहुत धीमी है?

$query = 
"SELECT SQL_NO_CACHE f.position, s.item_id, s.item_type, s.title, s.caption, s.date 
FROM apiv2.search_all s 
INNER JOIN apiv2.tags t 
USING(item_id, item_type) 
LEFT JOIN apiv2.featured f 
ON t.item_id = f.item_id AND t.item_type = f.item_type AND f.feature_type = :id 
WHERE t.tag = 'FeaturedContent' 
ORDER BY position IS NULL, position ASC, date"; 

$mysql_vars[':id'] = $id; 
$stmt = $connection->prepare($query); 
$stmt->execute($vars); 
$data = $stmt->fetchAll(PDO::FETCH_ASSOC); 

इस क्वेरी काफी अलग ढंग से केवल MYSQL कंसोल पर कि क्या मैं ORDER BY खंड शामिल हैं के आधार पर चलाता है, लेकिन:

- MYSQL Console with ORDER BY: 1.07 sec 
    - starting 0.000141 
    - Opening tables 0.001416 
    - System lock 0.000003 
    - Table lock 0.000007 
    - init 0.000021 
    - checking permissions 0.000001 
    - checking permissions 0.000036 
    - optimizing 0.000027 
    - statistics 0.000027 
    - preparing 0.000015 
    - Creating tmp table 0.003440 
    - executing 0.000001 
    - Copying to tmp table 1.050029 
    - Sorting result 0.013097 
    - Sending data 0.000295 
    - end 0.000002 
    - removing tmp table 0.002045 
    - end 0.000003 
    - query end 0.000002 
    - freeing items 0.000331 
    - logging slow query 0.000002 
    - cleaning up 0.000007 
- MYSQL Console unordered output: .0053 sec 
    - starting 0.000076 
    - Opening tables 0.001506 
    - System lock 0.000002 
    - Table lock 0.000005 
    - init 0.000015 
    - checking permissions 0.000001 
    - checking permissions 0.000022 
    - optimizing 0.000012 
    - statistics 0.000021 
    - preparing 0.000011 
    - executing 0.000001 
    - Sending data 0.002895 
    - end 0.000002 
    - query end 0.000001 
    - freeing items 0.000078 
    - logging slow query 0.000000 
    - cleaning up 0.000002 
- PDO Prepared stmt ORDER BY: 1.18 sec 
    - 'Status' => 'starting', 'Duration' => '0.000147' 
    - 'Status' => 'Opening tables', 'Duration' => '0.000784' 
    - 'Status' => 'System lock', 'Duration' => '0.000004' 
    - 'Status' => 'Table lock', 'Duration' => '0.000007' 
    - 'Status' => 'init', 'Duration' => '0.000017' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000002' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000028' 
    - 'Status' => 'optimizing', 'Duration' => '0.000018' 
    - 'Status' => 'statistics', 'Duration' => '0.000026' 
    - 'Status' => 'preparing', 'Duration' => '0.000014' 
    - 'Status' => 'Creating tmp table', 'Duration' => '0.002112' 
    - 'Status' => 'executing', 'Duration' => '0.000001' 
    - 'Status' => 'Copying to tmp table', 'Duration' => '1.033056' 
    - 'Status' => 'Sorting result', 'Duration' => '0.013759' 
    - 'Status' => 'Sending data', 'Duration' => '0.073144' 
    - 'Status' => 'end', 'Duration' => '0.000003' 
    - 'Status' => 'removing tmp table', 'Duration' => '0.001999' 
    - 'Status' => 'end', 'Duration' => '0.000004' 
    - 'Status' => 'query end', 'Duration' => '0.000007' 
    - 'Status' => 'freeing items', 'Duration' => '0.000118' 
    - 'Status' => 'logging slow query', 'Duration' => '0.000001' 
    - 'Status' => 'cleaning up', 'Duration' => '0.000003' 
- PDO Prepared stmt unordered output: 1.06 sec 
    - 'Status' => 'starting', 'Duration' => '0.000074' 
    - 'Status' => 'Opening tables', 'Duration' => '0.001364' 
    - 'Status' => 'System lock', 'Duration' => '0.000004' 
    - 'Status' => 'Table lock', 'Duration' => '0.000007' 
    - 'Status' => 'init', 'Duration' => '0.000017' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000001' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000026' 
    - 'Status' => 'optimizing', 'Duration' => '0.000015' 
    - 'Status' => 'statistics', 'Duration' => '0.000027' 
    - 'Status' => 'preparing', 'Duration' => '0.000013' 
    - 'Status' => 'executing', 'Duration' => '0.000002' 
    - 'Status' => 'Sending data', 'Duration' => '1.048216' 
    - 'Status' => 'end', 'Duration' => '0.000003' 
    - 'Status' => 'query end', 'Duration' => '0.000001' 
    - 'Status' => 'freeing items', 'Duration' => '0.000122' 
    - 'Status' => 'logging slow query', 'Duration' => '0.000001' 
    - 'Status' => 'cleaning up', 'Duration' => '0.000003' 
- MYSQL functions from PHP unordered: 1.09 sec 
    - 'Status' => 'starting', 'Duration' => '0.000109' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000002' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000001' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000004' 
    - 'Status' => 'Opening tables', 'Duration' => '0.002101' 
    - 'Status' => 'System lock', 'Duration' => '0.000004' 
    - 'Status' => 'Table lock', 'Duration' => '0.000009' 
    - 'Status' => 'init', 'Duration' => '0.000032' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000003' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000057' 
    - 'Status' => 'optimizing', 'Duration' => '0.000033' 
    - 'Status' => 'statistics', 'Duration' => '0.000065' 
    - 'Status' => 'preparing', 'Duration' => '0.000032' 
    - 'Status' => 'executing', 'Duration' => '0.000005' 
    - 'Status' => 'Sending data', 'Duration' => '1.000079' 
    - 'Status' => 'end', 'Duration' => '0.000005' 
    - 'Status' => 'query end', 'Duration' => '0.000002' 
    - 'Status' => 'freeing items', 'Duration' => '0.000300' 
    - 'Status' => 'logging slow query', 'Duration' => '0.000001' 
    - 'Status' => 'cleaning up', 'Duration' => '0.000007' 
- MYSQL functions from PHP w/ ORDER BY: 1.09 sec 
    - 'Status' => 'starting', 'Duration' => '0.000148' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000001' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000001' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000001' 
    - 'Status' => 'Opening tables', 'Duration' => '0.000559' 
    - 'Status' => 'System lock', 'Duration' => '0.000002' 
    - 'Status' => 'Table lock', 'Duration' => '0.000006' 
    - 'Status' => 'init', 'Duration' => '0.000019' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000001' 
    - 'Status' => 'checking permissions', 'Duration' => '0.000030' 
    - 'Status' => 'optimizing', 'Duration' => '0.000018' 
    - 'Status' => 'statistics', 'Duration' => '0.000025' 
    - 'Status' => 'preparing', 'Duration' => '0.000015' 
    - 'Status' => 'Creating tmp table', 'Duration' => '0.001828' 
    - 'Status' => 'executing', 'Duration' => '0.000001' 
    - 'Status' => 'Copying to tmp table', 'Duration' => '0.958071' 
    - 'Status' => 'Sorting result', 'Duration' => '0.013502' 
    - 'Status' => 'Sending data', 'Duration' => '0.088148' 
    - 'Status' => 'end', 'Duration' => '0.000003' 
    - 'Status' => 'removing tmp table', 'Duration' => '0.002037' 
    - 'Status' => 'end', 'Duration' => '0.000003' 
    - 'Status' => 'query end', 'Duration' => '0.000001' 
    - 'Status' => 'freeing items', 'Duration' => '0.000112' 
    - 'Status' => 'logging slow query', 'Duration' => '0.000001' 
    - 'Status' => 'cleaning up', 'Duration' => '0.000004' 

बताते हैं:

|-id-|-select_type-|-table----|-type---|-possible_keys--------|-key-----------------|-key_len-|-ref-------------------------------------|-rows--|-Extra 
|-1--|-SIMPLE------|-s--------|-ALL----|-PRIMARY,search_index-|-NULL----------------|-NULL----|-NULL------------------------------------|-92166-|-Using temporary; Using filesort 
|-1--|-SIMPLE------|-tags-----|-eq_ref-|-PRIMARY--------------|-PRIMARY-------------|-426-----|-apiv2.s.item_id,apiv2.s.item_type,const-|-1-----|-Using where; Using index 
|-1--|-SIMPLE------|-featured-|-ref----|-type_position_index--|-type_position_index-|-62------|-const-----------------------------------|-3-----|-Using index 
आदेश देने के साथ

आदेश

|-id-|-select_type-|-table----|-type---|-possible_keys--------|-key-----------------|-key_len-|-ref-------------------------------------|-rows--|-Extra 
|-1--|-SIMPLE------|-s--------|-ALL----|-PRIMARY,search_index-|-NULL----------------|-NULL----|-NULL------------------------------------|-88346-|- 
|-1--|-SIMPLE------|-tags-----|-eq_ref-|-PRIMARY--------------|-PRIMARY-------------|-426-----|-apiv2.s.item_id,apiv2.s.item_type,const-|-1-----|-Using where; Using index 
|-1--|-SIMPLE------|-featured-|-ref----|-type_position_index--|-type_position_index-|-62------|-const-----------------------------------|-3-----|-Using index 

तालिका के बिना: search_all

CREATE TABLE `search_all` ( 
    `item_id` varchar(20) NOT NULL DEFAULT '', 
    `item_type` varchar(20) NOT NULL DEFAULT '', 
    `title` varchar(255) DEFAULT NULL, 
    `caption` text, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`item_id`,`item_type`), 
    UNIQUE KEY `search_index` (`item_id`,`item_type`,`date`), 
    KEY `date_index` (`date`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


|-id-|-select_type-|-table------|-type-|-possible_keys-|-key--|-key_len-|-ref--|-rows--|-Extra 
|-1--|-SIMPLE------|-search_all-|-ALL--|-NULL----------|-NULL-|-NULL----|-NULL-|-74785-|- 

टेबल: टैग

CREATE TABLE `tags` ( 
    `tag` varchar(100) NOT NULL DEFAULT '', 
    `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `item_id` varchar(20) NOT NULL DEFAULT '', 
    `item_type` varchar(20) NOT NULL DEFAULT '', 
    PRIMARY KEY (`item_id`,`item_type`,`tag`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


|-id-|-select_type-|-table-|-type--|-possible_keys-|-key-----|-key_len-|-ref--|-rows---|-Extra 
|-1--|-SIMPLE------|-tags--|-index-|-NULL----------|-PRIMARY-|-426-----|-NULL-|-197400-|-Using index 

टेबल: विशेष रुप से प्रदर्शित

CREATE TABLE `featured` ( 
    `position` int(10) NOT NULL DEFAULT '0', 
    `item_type` varchar(20) NOT NULL DEFAULT '', 
    `item_id` varchar(20) NOT NULL DEFAULT '', 
    `feature_type` varchar(20) NOT NULL DEFAULT '', 
    PRIMARY KEY (`position`,`item_type`,`item_id`,`feature_type`), 
    KEY `type_position_index` (`feature_type`,`position`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


|-id-|-select_type-|-table----|-type--|-possible_keys-|-key-----------------|-key_len-|-ref--|-rows-|-Extra 
|-1--|-SIMPLE------|-featured-|-index-|-NULL----------|-type_position_index-|-66------|-NULL-|-13---|-Using index 

PHP से पीडीओ या एमएसक्यूएल में असाधारण के बीच कोई अंतर क्यों नहीं है? क्या कोई रास्ता है जिससे मैं इसे तेज कर सकता हूं?

+3

क्वेरी की परिभाषाएं (इंडेक्स सहित) और क्वेरी के (EXPLAIN) निष्पादन योजना पोस्ट करें। –

+0

क्या आप वास्तव में इसे पुन: उत्पन्न कर सकते हैं? "डेटा भेजना" पिछले उदाहरण में बहुत अधिक समय लगता है। शायद यह सिर्फ एक "अंतराल", या एक कैशिंग मुद्दा है। – KingCrunch

+1

मेरा मानना ​​है कि प्रोफाइल में प्रत्येक चरण की शुरुआत में समय की जांच की जाती है, जिसका अर्थ है कि लंबे समय से वास्तव में पिछले चरण की खराब समीक्षा होती है, जो 'निष्पादन' चरण – Ripptor

उत्तर

5

जब तक आपका ऑर्डर अनुक्रमित कॉलम के लिए नहीं है और ऑप्टिमाइज़र सोचता है कि इंडेक्स का उपयोग करने के लिए एक अच्छा विचार "ऑर्डर बी" का परिणाम होगा, जो किसी भी आकार के किसी भी परिणाम सेट के लिए महत्वपूर्ण समय और संसाधन लेगा।

पीडीओ संस्करण अधिक समय ले रहा है कारण यह है कि आपकी स्क्रिप्ट SQLServer की तुलना में धीमी पंक्तियों का उपभोग कर रही है, इसलिए डेटाबेस आपके प्रोग्राम की प्रतीक्षा कर रहा है। चूंकि आप एक व्याख्या की गई भाषा और एक एपीआई का उपयोग कर रहे हैं जो पंक्ति के परिणाम में काफी मात्रा में हेरफेर करता है, यह केवल उम्मीद की जा सकती है। इस डेटा से ओवरहेड की तुलना में यह डेटा "डेटा भेजना" बहुत बड़ा (0.75 सेकंड और 1.04 सेकंड) है।

ध्यान दें कि धीमी पुनर्प्राप्ति आदेश द्वारा मिश्रित है। अनियंत्रित एसक्यूएल के मामले में पंक्तियों को जल्द ही भेजा जाएगा जैसे ही वे चुने जाते हैं। आदेशित आदेश के मामले में सभी पंक्तियों का चयन किया जाएगा और फिर पहली परिणाम पंक्ति भेजने से पहले क्रमबद्ध किया जाएगा।

+1

मेरे पास स्थिति पर एक सूचकांक है, लेकिन चूंकि अधिकांश पंक्तियों को फ़ीचर में शामिल नहीं किया गया है, इसलिए अधिकांश में कोई स्थिति नहीं होगी। मैंने MYSQL पक्ष पर सॉर्टिंग को छोड़ने के लिए एक PHP सॉर्ट लागू किया था, लेकिन इस तरह से हटाने के बाद इसे तेज नहीं किया गया था, मुझे कोई सुधार नहीं हुआ है .. अगर मैं अनियंत्रित पीडीओ को तेज कर सकता हूं, तो मुझे लगता है कि यह काम कर सकता है। क्या आपके पास इस पर कोई सुझाव नहीं है? – Ripptor

0

क्या आप टेबल परिभाषाओं (फ़ील्ड, फ़ील्ड के प्रकार इत्यादि) पोस्ट कर सकते हैं?

मैं पहली बार एक सरल सूचकांक date पर तालिका search_all में एक साधारण सूचकांक tag पर तालिका tags में जोड़ सकते हैं और

होगा।

+0

तालिका परिभाषाओं को जोड़ा गया। Search_all में एक दिनांक अनुक्रमणिका है, और टैग तालिका एक ट्रिपल-कुंजी (item_id, item_type, टैग) – Ripptor

+0

@ रिप्रेटर है: इंडेक्स '(टैग)' इंडेक्स '(item_id, item_type, टैग) से बहुत अलग है। –

संबंधित मुद्दे