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

कई बड़े वैक्टर के साथ पंक्तियों को फ़िल्टर करें

यह 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

इसे सत्र-आधारित खोज में बदलना बहुत आसान होगा। अवधारणा एक है जिसमें खोज करने के लिए सरणी (टेबल ए बी सी) में सत्र कॉलम होता है। यह तब बहु-उपयोगकर्ता समवर्ती उपयोग की सुविधा प्रदान करेगा। लेकिन यह जवाब अति-इंजीनियरिंग है, लेकिन पूछें कि क्या आप उस पर और जानकारी चाहते हैं।




  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. शीर्ष एन प्रति समूह कोड के लिए क्वेरी MySQL के लिए काम करती है लेकिन मारियाडीबी के लिए अलग परिणाम

  3. Mysql दिनांक समारोह कम से कम के लिए काम नहीं कर रहा है

  4. एक SQL क्वेरी में दो तालिकाओं से दो स्तंभों को मिलाएं (मर्ज करें)

  5. अद्वितीय बाधा जो MySQL में दो स्तंभों की जाँच करती है