यह cross join
. की अवधारणा का उपयोग करता है a.k.a. कार्टेशियन उत्पाद (सभी क्रमपरिवर्तन)। तो आपके सरणी x*y*z
की पंक्ति गणना के साथ एक व्युत्पन्न तालिका (स्मृति में) उत्पन्न करते हैं , जहां वे x, y, z सरणियों के आकार हैं। यदि आपने आकार 3,4 और 5 के सरणियों की आपूर्ति की है, तो व्युत्पन्न तालिका में 3*4*5=60 की एक पंक्ति गणना होगी।
आपका आपूर्ति किया गया सरणी मिलान जो एक पंक्ति उत्पन्न करता है वह केवल 4*1*1=4
. था
thing7
नीचे आपकी मुख्य तालिका है जिसे आप खोज रहे हैं। covering index
इसमें एक टन डेटा के साथ भी इस चीज़ को उड़ाना चाहिए। एक कवरिंग इंडेक्स वह होता है जिसमें प्रदान की गई जानकारी इंडेक्स के बी-ट्री स्कैन के माध्यम से दी जाती है, और डेटा पेज को पढ़ने की आवश्यकता नहीं होती है। क्यों? क्योंकि आवश्यक डेटा इंडेक्स में है। और आपके मामले में, बेहद पतला।
टेबल्स ए बी सी आपके सरणियों के रूप में उपयोग के लिए हैं।
कहने के लिए केवल दूसरी बात यह है कि प्रत्येक व्युत्पन्न तालिका को एक नाम की आवश्यकता होती है। इसलिए हमने इसे xDerived
नाम दिया है क्वेरी में। एक व्युत्पन्न तालिका के बारे में सोचें जैसे कुछ लौटा और स्मृति में उपयोग किया जाता है। यह एक भौतिक तालिका नहीं है।
स्कीमा
create table thing7
( id int auto_increment primary key,
A int not null,
B int not null,
C int not null,
index(A,B,C) -- covering index (uber-thin, uber-fast)
);
insert thing7(A,B,C) values
(1,2,7),
(1,2,8),
(2,2,1),
(1,3,1);
create table A
( id int auto_increment primary key,
value int
);
create table B
( id int auto_increment primary key,
value int
);
create table C
( id int auto_increment primary key,
value int
);
टेस्ट 1
truncate table A;
truncate table B;
truncate table C;
insert A (value) values (1),(2),(3),(4);
insert B (value) values (2);
insert C (value) values (7);
select t7.*
from thing7 t7
join
( select A.value as Avalue, B.value as Bvalue, C.value as Cvalue
from A
cross join B
cross join C
order by a.value,b.value,c.value
) xDerived
on xDerived.Avalue=t7.A and xDerived.Bvalue=t7.B and xDerived.Cvalue=t7.C;
+----+---+---+---+
| id | A | B | C |
+----+---+---+---+
| 1 | 1 | 2 | 7 |
+----+---+---+---+
..
टेस्ट 2
truncate table A;
truncate table B;
truncate table C;
insert A (value) values (1);
insert B (value) values (2);
insert C (value) values (0);
select t7.*
from thing7 t7
join
( select A.value as Avalue, B.value as Bvalue, C.value as Cvalue
from A
cross join B
cross join C
order by a.value,b.value,c.value
) xDerived
on xDerived.Avalue=t7.A and xDerived.Bvalue=t7.B and xDerived.Cvalue=t7.C;
-- no rows returned
इसे सत्र-आधारित खोज में बदलना बहुत आसान होगा। अवधारणा एक है जिसमें खोज करने के लिए सरणी (टेबल ए बी सी) में सत्र कॉलम होता है। यह तब बहु-उपयोगकर्ता समवर्ती उपयोग की सुविधा प्रदान करेगा। लेकिन यह जवाब अति-इंजीनियरिंग है, लेकिन पूछें कि क्या आप उस पर और जानकारी चाहते हैं।