कृपया 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
. को शामिल करने का कोई उपयोगी तरीका नहीं है किसी भी अनुक्रमणिका में, इसलिए मेरे पिछले कुछ सुझावों को बदलने की आवश्यकता है।