Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

शर्त जोड़ने के बाद गंभीर MySQL क्वेरी प्रदर्शन समस्याएं

कृपया SHOW CREATE TABLE provide प्रदान करें ।

मैं इन समग्र अनुक्रमणिकाओं को देखने की आशा करूंगा:

`val`: (entityId, attributeId)   -- order is not critical

काश, क्योंकि code LONGTEXT है , यह entity . के लिए संभव नहीं है :INDEX(type, code, entityId) . इसलिए यह बहुत कारगर नहीं होगा:

        SELECT  entityId
            from  entity
            where  code = v9.Value
              and  type = 97
            limit  1

मुझे LIMIT दिखाई दे रहा है एक ORDER BY . के साथ -- क्या आपको परवाह है कि आपको कौन सा मूल्य मिलता है?

संभवत:इसे

. के रूप में बेहतर तरीके से लिखा जाएगा
    WHERE EXISTS ( SELECT 1 FROM entity
                WHERE entityID = e3.entityID
                  AND code     = v9.Value
                  AND type = 97 )

(क्या आप e3 . के मिश्रण के बारे में सुनिश्चित हैं? और v9 ?)

रैपिंग...

यह LEFT JOIN . को बाध्य करता है बनने के लिए JOIN . और यह तत्कालीन आंतरिक ORDER BY . से छुटकारा दिलाता है ।

तब अनुकूलक संभवत:यह निर्णय लेता है कि 68e9145e-43eb-4581-9727-4212be41bef5 से प्रारंभ करना सबसे अच्छा है , जिसे मैं val AS v11 . कहता हूं :

JOIN val AS v11 ON (v11.entityId = e2.id
             and  v11.attributeId = 1614)
             AND  v11.Value = 'bar2')

यदि यह एक EAV तालिका है, तो यह केवल यह सत्यापित करती है कि [, 1514] का मान 'bar2' है। यह एक समझदार परीक्षा नहीं लगती।

मेरी पूर्व अनुशंसा के अतिरिक्त।

मैं पसंद करूंगा EXPLAIN SELECT ...

ईएवी

मान लें कि val एक पारंपरिक ईएवी तालिका है, यह शायद बहुत बेहतर होगा:

CREATE TABLE `val` (
  `attributeId` int(11) NOT NULL,
  `entityId` int(11) NOT NULL,
  `Value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
  PRIMARY KEY(`entityId`,`attributeId`),
  KEY `IX_val_attributeId` (`attributeId`),
) ENGINE=InnoDB AUTO_INCREMENT=2325375 DEFAULT CHARSET=latin1

दो आईडी का कोई व्यावहारिक उपयोग नहीं है (जब तक कि मुझे कुछ याद नहीं आ रहा है)। यदि आपको ढांचे के कारण उनका उपयोग करने के लिए मजबूर किया जाता है, तो यह दुर्भाग्यपूर्ण है। पीके होने के लिए (इकाई आईडी, विशेषता आईडी) को बढ़ावा देने से value प्राप्त होता है थोड़ा तेज।

LONGTEXT . को शामिल करने का कोई उपयोगी तरीका नहीं है किसी भी अनुक्रमणिका में, इसलिए मेरे पिछले कुछ सुझावों को बदलने की आवश्यकता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जोडा समय के साथ 2 तिथियों के बीच अंतर दिनों की गलत गणना?

  2. MySQL कमांड लाइन और लेनदेन

  3. मैसकल पासवर्ड की समय सीमा समाप्त हो गई। कनेक्ट नहीं हो सकता

  4. जटिल SQL क्वेरी, अनेक से अनेक

  5. आप MySql IN क्लॉज का उपयोग कैसे करते हैं?