mysql - एक पूछताछ में सुधार करने के लिए बहुत सारे आंतरिक wp_postmeta, एक कुंजी/मान तालिका में मिलती है




database wordpress (6)

एक वर्डप्रेस वेबसाइट के साथ काम कर रहा हूं जो निम्नलिखित प्रश्न का पालन कर रहा है, लेकिन मुझे लगता है कि यह पूछताछ बहुत से आंतरिक सम्मिलित हो रही है और वेबसाइट को लोड करने में बहुत समय लगता है और बहुत नीचे जाता है, और मैं एक ऐसा क्वेरी बनाने का प्रयास कर रहा हूं जो समान परिणाम उत्पन्न करता है लेकिन अभी तक कोई सफलता नहीं मिली है

मैं जानना चाहूंगा कि यह करने का एक बेहतर तरीका क्या हो सकता है

SELECT *
FROM wp_posts
INNER JOIN wp_postmeta color ON wp_posts.ID = color.post_id 
INNER JOIN wp_postmeta transmission ON wp_posts.ID = transmission.post_id 
INNER JOIN wp_postmeta model ON wp_posts.ID = model.post_id 
INNER JOIN wp_postmeta brand ON wp_posts.ID = brand.post_id 

AND color.meta_key = 'color' 
AND color.meta_value = 'red' 
AND transmission.meta_key = 'transmission' 
AND transmission.meta_value = 'auto' 
AND model.meta_key = 'model' 
AND model.meta_value = 'model' 
AND brand.meta_key = 'brand' 
AND brand.meta_value = 'brand'

AND wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'car'
ORDER BY wp_posts.post_title

यहां आउटपुट समझा गया है

+----+-------------+-----------+--------+-----------------------------+----------+---------+------------------------+------+----------------------------------------------+
| id | select_type | table         | type   | possible_keys               | key      | key_len | ref                          | rows | Extra                                        |
+----+-------------+-----------+--------+-----------------------------+----------+---------+------------------------+------+----------------------------------------------+
|  1 | SIMPLE      | color         | ref    | post_id,meta_key            | meta_key | 768     | const                        |  629 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | wp_posts      | eq_ref | PRIMARY,type_status_date,ID | PRIMARY  | 8       | tmcdb.color.post_id          |    1 | Using where                                  |
|  1 | SIMPLE      | brand         | ref    | post_id,meta_key            | post_id  | 8       | tmcdb.wp_posts.ID            |    4 | Using where                                  |
|  1 | SIMPLE      | transmission  | ref    | post_id,meta_key            | post_id  | 8       | tmcdb.color.post_id          |    4 | Using where                                  |
|  1 | SIMPLE      | model         | ref    | post_id,meta_key            | post_id  | 8       | tmcdb.transmission.post_id   |    4 | Using where                                  |
+----+-------------+-----------+--------+-----------------------------+----------+---------+------------------------+------+----------------------------------------------+

वर्डप्रेस स्कीमा यहाँ।


10+ के साथ प्रदर्शन समस्या हल करने के लिए, utf8 वर्णसेट का उपयोग करते हुए इनऑनडब तालिका पर एसक्यूएल प्रश्नों को जोड़ता है, पोस्टमेटा पर एक नया सूचक बनाना:

बैकअप डेटाबेस पहले। " विशिष्ट कुंजी बहुत लंबी थी, अधिकतम कुंजी लंबाई 767 बाइट्स " त्रुटि से बचने के लिए [wp_]postmeta.meta_key लंबाई को 1 9 करने के लिए कम करें।

ALTER TABLE wp_postmeta MODIFY meta_key VARCHAR(191);

सूचकांक बनाएं

CREATE INDEX wpm_ix ON wp_postmeta (post_id, meta_key);


ऐसा लगता है कि आप प्रति पोस्ट प्रकार की car अनुसार एक पंक्ति के साथ एक परिणाम सेट प्राप्त करने का प्रयास कर रहे हैं। ऐसा लगता है कि आप पोस्ट में प्रत्येक कार के विभिन्न विशेषताओं को प्रदर्शित करना चाहते हैं, और ये postmeta में दूर postmeta

प्रो टिप: कभी भी SELECT * में सॉफ़्टवेयर का उपयोग करें जब तक आप इसे बिल्कुल नहीं जानते कि आप यह क्यों कर रहे हैं। विशेष रूप से बहुत से JOIN संचालन वाले क्वेरीज़ के साथ, SELECT * बहुत सारे व्यर्थ और अनावश्यक कॉलम देता है

वर्डप्रेस postmeta टेबल के बारे में जानने के लिए एक क्वेरी डिज़ाइन ट्रिक है यदि आप एक विशेष विशेषता प्राप्त करना चाहते हैं, तो यह करें:

 SELECT p.ID, p.post_title,
        color.meta_value AS color
   FROM wp_posts AS p
   LEFT JOIN wp_postmeta AS color ON p.ID = color.post_id AND 'color' = color.meta_key
  WHERE p.post_status = 'publish'
    AND /* etc etc */

यह करने के लिए आप क्या करने की कोशिश कर रहे हैं जब यह पैटर्न समझने के लिए अति महत्वपूर्ण है यह पैटर्न आवश्यक है क्योंकि postmeta एक विशिष्ट प्रकार की तालिका है जिसे कुंजी / मान स्टोर कहा जाता है। यहाँ क्या चल रहा है? कुछ बातें:

  1. इस पद्धति का उपयोग करते हुए आपको प्रत्येक पद के लिए एक पंक्ति प्राप्त होती है, posts तालिका के कुछ कॉलम और posts postmeta टेबल से एक विशेष विशेषता।
  2. आप postmeta टेबल में शामिल हो गए हैं, इसलिए यदि आपको विशेषता याद आ रही है तो आपको अभी भी एक पंक्ति मिलती है।
  3. आप postmeta तालिका के लिए उपनाम नाम का उपयोग कर रहे हैं। यहां postmeta AS color
  4. आप meta_key के चयनकर्ता को शामिल कर रहे हैं (यहां 'color' = color.meta_key ) शामिल होने की स्थिति में।
  5. आप उपयुक्त स्तंभ नाम के साथ postmeta.meta_value आइटम पेश करने के लिए अपने SELECT खंड में एक अन्य नाम का उपयोग कर रहे हैं। यहां color.meta_value AS color

एक बार जब आप इस पद्धति को नियोजित करने के लिए इस्तेमाल करते हैं, तो आप इसे अलग-अलग विशेषताओं के बहुत सारे प्राप्त करने के लिए, LEFT JOIN कार्यों के झरने के साथ, इसे ढेर कर सकते हैं।

     SELECT wp_posts.ID, wp_posts.post_title, wp_posts.whatever,
            color.meta_value        AS color,
            transmission.meta_value AS transmission,
            model.meta_value        AS model,
            brand.meta_value        AS brand
       FROM wp_posts

  LEFT JOIN wp_postmeta  AS color 
         ON wp_posts.ID = color.post_id        AND color.meta_key='color'

  LEFT JOIN wp_postmeta  AS transmission
         ON wp_posts.ID = transmission.post_id AND transmission.meta_key='transmission'

  LEFT JOIN wp_postmeta  AS model
         ON wp_posts.ID = model.post_id        AND model.meta_key='model'

  LEFT JOIN wp_postmeta  AS  brand
         ON wp_posts.ID = brand.post_id        AND brand.meta_key='brand'

      WHERE wp_posts.post_status = 'publish'
        AND wp_posts.post_type = 'car'
   ORDER BY wp_posts.post_title

मैंने इस क्वेरी पर indenting का एक गुच्छा किया है जिससे कि पैटर्न को देखना आसान हो सके। आप एक अलग इंडेंटिंग शैली पसंद कर सकते हैं

यह जानना कठिन है कि आप अपने प्रश्न में क्वेरी के साथ प्रदर्शन समस्याएं क्यों बना रहे थे संभवत: यह संभव है क्योंकि आप सभी INNER JOIN ऑपरेशन के साथ संयोजन विस्फोट प्राप्त कर रहे थे जो तब फ़िल्टर्ड किया गया था। लेकिन किसी भी दर पर जो क्वेरी आपने दिखाई थी वह शायद कोई पंक्ति नहीं लौट रही थी।

यदि आपको अभी भी समस्याएं आ रही हैं, तो postmeta पर (post_id, meta_key, meta_value) कॉलम पर एक कंपाउंड इंडेक्स बनाने का प्रयास करें। यदि आप एक वर्डप्रेस प्लगइन बना रहे हैं, तो शायद यह प्लगइन इंस्टॉलेशन समय पर काम करना है।


प्रदर्शन के लिए प्रयास करें:

जिन स्तंभों को आप खींचना चाहते हैं, उनके बारे में स्पष्ट रहें। देखें कि क्या अनुक्रमित हो सकता है आप की आवश्यकता हो सकती है या नहीं। निकाली गई पंक्तियों की मात्रा को सीमित करें


यह एक वर्डप्रेस डाटाबेस है, और आप स्कीमा में व्यापक बदलाव करने के लिए अनिच्छुक हो सकते हैं, क्योंकि यह भविष्य के अन्य हिस्सों को तोड़ सकता है या उन्नयन को बढ़ा सकता है।

इस क्वेरी की कठिनाई इकाई-एट्रिब्यूट-वैल्यू डिज़ाइन में डाउनसाइड्स में से एक को दर्शाती है। यह डिजाइन लचीला है, क्योंकि यह रनटाइम पर नए एट्रिब्यूट्स को बनाने के लिए अनुमति देता है, लेकिन यह इस तरह के डेटा के खिलाफ बहुत सारे प्रश्न पूछता है जो कि वे एक परंपरागत तालिका से अधिक जटिल होंगे।

Wordpress के लिए स्कीमा अच्छी तरह से अनुकूलित नहीं की गई है। यहां कुछ भोले-गलती अनुक्रमण गलतियां हैं, यहां तक ​​कि सबसे वर्तमान संस्करण 4.0 में।

इस विशेष क्वेरी के लिए, निम्न दो अनुक्रमित मदद करते हैं:

CREATE INDEX `bk1` ON wp_postmeta (`post_id`,`meta_key`,`meta_value`(255));

CREATE INDEX `bk2` ON wp_posts (`post_type`,`post_status`,`post_title`(255));

bk1 सूचकांक सही मेटा कुंजी और मूल्य को देखने में मदद करता है।

bk2 सूचकांक bk2 से बचने में मदद करता है।

ये अनुक्रमित अनुक्रमित नहीं हो सकते, क्योंकि meta_value और meta_value TEXT स्तंभ हैं, और ये पूरी तरह अनुक्रमित होने के लिए बहुत लंबा हैं। आपको उन्हें VARCHAR(255) बदलना होगा लेकिन यह उस आवेदन को तोड़ने का जोखिम है, यदि वह उस तालिका में लंबे समय तक तारों को संग्रहण करने पर निर्भर करता है।

+----+-------------+--------------+------------+------+---------------+------+---------+----------------------------+------+----------+-----------------------+
| id | select_type | table        | partitions | type | possible_keys | key  | key_len | ref                        | rows | filtered | Extra                 |
+----+-------------+--------------+------------+------+---------------+------+---------+----------------------------+------+----------+-----------------------+
|  1 | SIMPLE      | wp_posts     | NULL       | ref  | bk2           | bk2  | 124     | const,const                |    1 |   100.00 | Using index condition |
|  1 | SIMPLE      | color        | NULL       | ref  | bk1           | bk1  | 1542    | wp.wp_posts.ID,const,const |    1 |   100.00 | Using index           |
|  1 | SIMPLE      | transmission | NULL       | ref  | bk1           | bk1  | 1542    | wp.wp_posts.ID,const,const |    1 |   100.00 | Using index           |
|  1 | SIMPLE      | model        | NULL       | ref  | bk1           | bk1  | 1542    | wp.wp_posts.ID,const,const |    1 |   100.00 | Using index           |
|  1 | SIMPLE      | brand        | NULL       | ref  | bk1           | bk1  | 1542    | wp.wp_posts.ID,const,const |    1 |   100.00 | Using index           |
+----+-------------+--------------+------------+------+---------------+------+---------+----------------------------+------+----------+-----------------------+

वर्डप्रेस में एक अच्छी क्वेरी टूल है WP_Query। मेटा मान पोस्ट करने के लिए आप इस कोड का उपयोग कर सकते हैं:

$args = array(
    'post_type'  => 'post',
    'meta_query' => array(
            array(
                'key'     => 'fieldname',
                'value'   => 'fieldvalue',
                'compare' => 'LIKE',
            ),
        ),
    );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            $custom = get_post_custom();

            print_r($post);
            print_r($custom);
        }
    } else {
        // no posts found
    }
    wp_reset_postdata();

क्वेरी एपीआई के बारे में अधिक जानकारी के लिए इस साइट पर जाएं, कई उदाहरण हैं: http://codex.wordpress.org/Class_Reference/WP_Query






inner-join