Điều này sử dụng khái niệm về cross join
a.k.a Tích Descartes (tất cả các hoán vị). Vì vậy, các mảng của bạn tạo ra một bảng dẫn xuất (trong bộ nhớ) với số hàng là x*y*z
, trong đó x, y, z là kích thước của mảng. Nếu bạn cung cấp các mảng có kích thước 3,4 và 5, bảng dẫn xuất sẽ có số hàng là 3 * 4 * 5 =60.
Đối sánh mảng được cung cấp của bạn tạo ra một hàng chỉ là 4 * 1 * 1 =4
thing7
dưới đây là bảng chính của bạn mà bạn đang tìm kiếm. covering index
sẽ làm cho thứ này bay ngay cả khi có rất nhiều dữ liệu trong đó. Chỉ mục bao trùm là chỉ mục trong đó thông tin được cung cấp được cung cấp qua quá trình quét b-tree của chỉ mục và không yêu cầu đọc trang dữ liệu. Tại sao? Bởi vì dữ liệu cần thiết nằm trong chỉ mục. Và trong trường hợp của bạn, cực kỳ mỏng.
Các bảng A B C được sử dụng làm mảng của bạn.
Điều khác duy nhất cần nói là mọi bảng dẫn xuất đều yêu cầu một tên. Vì vậy, chúng tôi đã đặt tên cho nó là xDerived
trong truy vấn. Hãy nghĩ về một bảng dẫn xuất như một thứ gì đó được trả về và sử dụng trong bộ nhớ. Nó không phải là một bảng vật lý.
Lược đồ
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
);
Thử nghiệm 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 |
+----+---+---+---+
..
Bài kiểm tra 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
Sẽ rất dễ dàng để biến điều này thành một tìm kiếm dựa trên phiên. Khái niệm có một trong đó các mảng cần tìm kiếm (bảng A B C) có một cột phiên. Sau đó, nó sẽ tạo điều kiện sử dụng đồng thời nhiều người dùng. Nhưng đó là câu trả lời được thiết kế kỹ thuật quá mức nhưng hãy hỏi xem bạn có muốn biết thêm thông tin về điều đó không.