मेरे पास निम्न प्रश्न है और यह काम करता है। लेकिन इसके बिल्डअप के कारण इसे प्रोसेस करने में बहुत लंबा समय लगता है। इसलिए मुझे इस प्रश्न को तेजी से प्राप्त करने के लिए सहायता की आवश्यकता है।

एसक्यूएल क्वेरी

क्वेरी में PRODUCT_ID को '' ' और productID नंबर से बदला जाना चाहिए।

SELECT
    b.order_id,
    customer_meta.meta_value AS customer_id,
    users.user_email,
    qty_table.meta_value AS qty,
    user_meta1.meta_value AS firstname,
    user_meta2.meta_value AS lastname,
    user_meta3.meta_value AS company,
    user_meta4.meta_value AS address,
    user_meta5.meta_value AS city,
    user_meta6.meta_value AS postcode,
    user_meta7.meta_value AS state,
    user_meta8.meta_value AS user_phone
FROM
    wp_woocommerce_order_itemmeta a,
    wp_woocommerce_order_items b,
    wp_postmeta customer_meta,
    wp_users users,
    wp_woocommerce_order_itemmeta qty_table,
    wp_usermeta user_meta1,
    wp_usermeta user_meta2,
    wp_usermeta user_meta3,
    wp_usermeta user_meta4,
    wp_usermeta user_meta5,
    wp_usermeta user_meta6,
    wp_usermeta user_meta7,
    wp_usermeta user_meta8
WHERE
    a.meta_key = '_product_id'
    AND a.meta_value = PRODUCT_ID
    AND a.order_item_id = b.order_item_id
    AND customer_meta.meta_key = '_customer_user'
    AND customer_meta.post_id = b.order_id
    AND user_meta1.meta_key = 'first_name'
    AND user_meta1.user_id = users.id
    AND user_meta2.meta_key = 'last_name'
    AND user_meta2.user_id = users.id
    AND user_meta3.meta_key = 'billing_company'
    AND user_meta3.user_id = users.id
    AND user_meta4.meta_key = 'billing_address_1'
    AND user_meta4.user_id = users.id
    AND user_meta5.meta_key = 'billing_city'
    AND user_meta5.user_id = users.id
    AND user_meta6.meta_key = 'billing_postcode'
    AND user_meta6.user_id = users.id
    AND user_meta7.meta_key = 'billing_state'
    AND user_meta7.user_id = users.id
    AND user_meta8.meta_key = 'billing_phone'
    AND user_meta8.user_id = users.id
    AND users.ID = customer_meta.meta_value
    AND qty_table.meta_key = '_qty'
    AND qty_table.order_item_id = b.order_item_id
ORDER BY user_meta3.meta_value ASC

मुझे सभी जानकारी की आवश्यकता है, क्योंकि मैं सभी उपयोगकर्ताओं को उनके पहले नाम, अंतिम नाम, कंपनी, पता, पोस्टकोड, आदि के साथ किसी दिए गए उत्पाद के लिए सूचीबद्ध करना चाहता हूं जिसे खरीदा गया है। तो क्वेरी अपने आप में काम करती है, लेकिन प्रक्रिया समय में एक हत्यारा है।

मैं a_name के रूप में max( CASE WHEN ... ... THEN ...END ) का उपयोग कर सकता था, लेकिन मैं केवल यह जानता हूं कि इसे सफलतापूर्वक कैसे किया जाए यदि मैं लेफ्ट जॉइन का उपयोग करता हूं।

इस क्वेरी को बेहतर तरीके से चलाने के लिए कोई सुझाव?

3
Zhakal 15 फरवरी 2017, 21:05

3 जवाब

सबसे बढ़िया उत्तर

WP, क्या आप सुन रहे हैं? WooCommerce, क्या आप सुन रहे हैं? मैं आपके डेटाबेस ऐप को ऑप्टिमाइज़ करते-करते थक गया हूँ।

सबसे पहले और सबसे महत्वपूर्ण, ईएवी एक भयानक स्कीमा डिज़ाइन है। लेकिन मैं इसके बारे में शेखी नहीं बघारूंगा। मैं केवल उन इंडेक्स (एस) को इंगित करूंगा जो शायद गायब हैं या खराब गठित हैं:

wp_usermeta:  PRIMARY KEY(user_id, meta_key)

किसी भी (191) ने बिना का सामना किया।

इसी तरह wp_woocommerce_order_itemmeta के लिए।

मुझे बाहर निकालने के लिए और अधिक गाली-गलौज हो सकती है; कृपया उपयोग की जा रही तालिकाओं के लिए SHOW CREATE TABLE प्रदान करें।

2
Rick James 18 फरवरी 2017, 06:06
आपको धन्यवाद! दोनों में इंडेक्स जोड़कर यह धीमी क्वेरी को हल करता है और यह उन्हें तेजी से प्रदर्शित करता है।
 – 
Zhakal
21 फरवरी 2017, 23:26
अब उन इंडेक्स को शामिल करने के लिए WP और Woo को मनाने के लिए !!
 – 
Rick James
22 फरवरी 2017, 01:48
पोस्टमेटा को बेहतर बनाने के बारे में अधिक जानकारी: mysql.rjweb.org/doc.php/…
 – 
Rick James
31 मई 2020, 19:49
1
या wordpress.org/plugins/index-wp-mysql-for-speed करने दें आपके लिए ALTERs करें।
 – 
Rick James
31 अक्टूबर 2021, 18:20

रिक जेम्स द्वारा वर्णित इंडेक्स को जोड़ने से मूल क्वेरी बहुत तेज हो जाएगी।

लेकिन मैंने इसे लेफ्ट जॉइन का उपयोग करने के लिए बदलने में कामयाबी हासिल की है और यह अब तक का सबसे तेज़ है और अगर किसी और को इसकी आवश्यकता होगी तो यहां दिखाया गया है:

SELECT
  b.order_id, 
  customer_meta.meta_value as customer_id,
  u.display_name as customer_name,
  u.user_email, 
  qty_table.meta_value as qty,
  um_last_name.meta_value as last_name,
  um_first_name.meta_value as first_name,
  um_address1.meta_value as address1,
  um_address2.meta_value as address2,
  um_address_city.meta_value as city,
  um_address_state.meta_value as state,
  um_company.meta_value as company,
  um_email.meta_value as billing_email
FROM wp_woocommerce_order_itemmeta a
  LEFT JOIN wp_woocommerce_order_items b on a.order_item_id = b.order_item_id
  LEFT JOIN wp_postmeta customer_meta on customer_meta.post_id = b.order_id AND customer_meta.meta_key = '_customer_user'
  LEFT JOIN wp_users u on u.ID = customer_meta.meta_value
  LEFT JOIN wp_woocommerce_order_itemmeta qty_table on qty_table.order_item_id = b.order_item_id and qty_table.meta_key = '_qty'
  LEFT JOIN wp_usermeta um_last_name on u.ID = um_last_name.user_id and um_last_name.meta_key = 'last_name'
  LEFT JOIN wp_usermeta um_first_name on u.ID = um_first_name.user_id and um_first_name.meta_key = 'first_name'
  LEFT JOIN wp_usermeta um_address1 on u.ID = um_address1.user_id and um_address1.meta_key = 'billing_address_1'
  LEFT JOIN wp_usermeta um_address2 on u.ID = um_address2.user_id and um_address2.meta_key = 'billing_address_2'
  LEFT JOIN wp_usermeta um_address_city on u.ID = um_address_city.user_id and um_address_city.meta_key = 'billing_city'
  LEFT JOIN wp_usermeta um_address_state on u.ID = um_address_state.user_id and um_address_state.meta_key = 'billing_state'
  LEFT JOIN wp_usermeta um_email on u.ID = um_email.user_id and um_email.meta_key = 'billing_email'
  LEFT JOIN wp_usermeta um_company on u.ID = um_company.user_id and um_company.meta_key = 'billing_company'
WHERE
  a.meta_key = '_product_id' AND a.meta_value = PRODUCT_ID
0
Zhakal 21 फरवरी 2017, 23:50

वर्षों बाद, @RickJames से बात करने के बाद, आपके प्रश्न का एक और उत्तर यहां दिया गया है।

  1. आपने क्वेरी को कॉमा-जॉइन से लेफ्ट जॉइन में रिफैक्टर किया है। यह अच्छा है। आपके कॉमा-जॉइन सिंटैक्स ने परिणाम सेट से अनुपलब्ध मेटाडेटा वाले उपयोगकर्ताओं को छोड़ दिया।

  2. यदि आपने पहले से ऐसा नहीं किया है, तो सुनिश्चित करें कि आपने अपने MySQL सर्वर को अपग्रेड किया है ताकि यह 5.7 या बाद का संस्करण हो। यदि आप मारियाडीबी का उपयोग करते हैं, तो इसे अपग्रेड करें ताकि यह संस्करण 10.3 या बाद का हो। संस्करण प्रदर्शन के लिए महत्वपूर्ण है।

  3. वर्डप्रेस प्लगइन Index WP MySQL for speed इंस्टॉल और इस्तेमाल करें। रिक और मैंने आपकी समस्या का ठीक-ठीक समाधान करने के लिए इसे एक साथ रखा है। यह इस प्रकार के प्रश्नों को अधिक कुशल बनाने के लिए wp_usermeta (और कुछ अन्य वर्डप्रेस टेबल) को फिर से अनुक्रमित करता है।

या, यदि आप अपनी तालिकाओं को पुन: अनुक्रमित करने के लिए प्लग इन का उपयोग नहीं करना चाहते हैं, तो आप इसे स्वयं कर सकते हैं phpmyadmin या किसी अन्य SQL क्लाइंट के माध्यम से। (यदि आप MySQL के पुराने संस्करण पर अटके हुए हैं तो ये कथन काम नहीं करेंगे। प्लगइन में एक समाधान जो कि StackOverflow उत्तर में समझाने के लिए थोड़ा बहुत जटिल है।)

ALTER TABLE wp_usermeta ENGINE=InnoDB, ROW_FORMAT=Dynamic;
ALTER TABLE wp_usermeta ADD UNIQUE KEY umeta_id (umeta_id);
ALTER TABLE wp_usermeta DROP PRIMARY KEY;
ALTER TABLE wp_usermeta ADD PRIMARY KEY (user_id, meta_key, umeta_id);
ALTER TABLE wp_usermeta DROP KEY user_id;
ALTER TABLE wp_usermeta DROP KEY meta_key;
ALTER TABLE wp_usermeta ADD KEY meta_key (meta_key, user_id);

अनुक्रमणिका का यह सेट आपके प्रश्नों को उन बाएं-जुड़े मेटा_वैल्यू विशेषताओं को अधिक कुशलता से पुनर्प्राप्त करने की अनुमति देता है। क्यों? संक्षेप में, इस उद्देश्य के लिए तालिका को (user_id, meta_key) पर एक अनुक्रमणिका की आवश्यकता है। और InnoDB में, तालिका में डेटा वास्तव में प्राथमिक कुंजी के सूचकांक में संग्रहीत होता है (इसे संकुलित अनुक्रमणिका)। तो MySQL बहुत जल्दी आपके लिए आवश्यक मेटा_वैल्यू को पुनः प्राप्त कर सकता है।

0
O. Jones 1 नवम्बर 2021, 17:01