Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lọc các hàng với một số vectơ lớn

Đ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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Loại dữ liệu nào để sử dụng cho trường mật khẩu băm và độ dài là bao nhiêu?

  2. meta_query, cách tìm kiếm bằng cả quan hệ OR &AND?

  3. MySQL - Ràng buộc KHÔNG NULL có cần thiết cho khóa chính không?

  4. Chọn Cơ sở dữ liệu MySQL trên Linux qua Dòng lệnh

  5. Cú pháp tìm kiếm toàn văn bản MySQL thay thế