Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Filter baris dengan beberapa vektor besar

Ini menggunakan konsep cross join alias Produk Cartesian (semua permutasi). Jadi array Anda menghasilkan tabel turunan (dalam memori) dengan jumlah baris x*y*z , di mana x,y,z itu adalah ukuran array. Jika Anda menyediakan larik berukuran 3,4, dan 5, tabel turunan akan memiliki jumlah baris 3*4*5=60.

Pencocokan larik yang Anda berikan yang menghasilkan baris hanya 4*1*1=4

thing7 di bawah ini adalah tabel utama yang Anda cari. covering index harus membuat hal ini terbang bahkan dengan banyak data di dalamnya. Indeks penutup adalah indeks di mana informasi yang diberikan diberikan melalui pemindaian b-tree indeks, dan pembacaan halaman data tidak diperlukan. Mengapa? Karena data yang dibutuhkan ada di index. Dan dalam kasus Anda, sangat tipis.

Tabel A B C digunakan sebagai array Anda.

Satu-satunya hal lain untuk dikatakan adalah bahwa setiap tabel turunan memerlukan nama. Jadi kami memberinya nama xDerived dalam kueri. Pikirkan tabel turunan sebagai sesuatu yang dikembalikan dan digunakan dalam memori. Ini bukan tabel fisik.

Skema

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
);

Uji 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 |
+----+---+---+---+

..

Uji 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

Akan sangat mudah untuk mengubah ini menjadi pencarian berbasis sesi. Konsepnya ada satu di mana array yang akan dicari (tabel A B C) memiliki kolom sesi. Ini kemudian akan memfasilitasi penggunaan bersamaan multi-pengguna. Tapi itu adalah jawaban yang terlalu direkayasa, tetapi tanyakan apakah Anda ingin info lebih lanjut tentang itu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Tambahkan batasan jika tidak ada

  2. Prosedur tersimpan MYSQL, kasus

  3. Bagaimana cara kerja batasan unik dengan nilai NULL di MySQL

  4. Karakter apa yang harus diloloskan untuk mencegah injeksi SQL (Saya)?

  5. Dua pernyataan mysql_fetch_array di