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

Kueri SQL yang mencari baris yang memenuhi Kolom1 <=X <=Kolom2 sangat lambat

Saya menemukan solusi yang bergantung pada properti data dalam tabel. Saya lebih suka memiliki solusi yang lebih umum yang tidak bergantung pada data saat ini, tetapi untuk saat ini itulah yang terbaik yang saya miliki.

Masalah dengan kueri asli:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;

adalah bahwa eksekusi mungkin memerlukan pemindaian sebagian besar entri di FirstX ,LastX ,P indeks ketika kondisi pertama FirstX <= ? dipenuhi oleh sebagian besar baris.

Apa yang saya lakukan untuk mengurangi waktu eksekusi adalah mengamati bahwa LastX-FirstX relatif kecil.

Saya menjalankan kueri:

SELECT MAX(LastX-FirstX) FROM SomeTable;

dan dapatkan 4200000 .

Artinya FirstX >= LastX – 4200000 untuk semua baris dalam tabel.

Jadi untuk memenuhi LastX >= ? , kita juga harus memenuhi FirstX >= ? – 4200000 .

Jadi kita bisa menambahkan kondisi ke query sebagai berikut:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;

Dalam contoh yang saya uji dalam pertanyaan, jumlah entri indeks yang diproses berkurang dari 2104820 ke 18 dan waktu berjalan berkurang dari 0,563 detik hingga 0,0003 detik .

Saya menguji kueri baru dengan 120000 yang sama nilai X . Outputnya identik dengan kueri lama. Waktu turun dari lebih dari 10 jam hingga 5,5 menit , yang lebih dari 100 kali lebih cepat .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hapus baris dengan PHP - PDO di halaman web

  2. Ubah stempel waktu VARCHAR ke TIMESTAMP?

  3. Kueri MySql berjalan tetapi tidak berfungsi di sp

  4. Basis data tidur dan menyebabkan pengecualian

  5. bind_param() hanya diperlukan pada nilai yang dimasukkan pengguna atau semuanya?