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

Indeks MySQL - praktik terbaik apa yang sesuai dengan tabel dan kueri ini

Kueri ini:

SELECT *
FROM listings
WHERE (publishedon BETWEEN 1441105258 AND 1443614458) AND
      (published = 1) AND
      (cat_id in (1,2,3,4,5)) AND
      (source_id in (1,2,3,4,5));

Sulit untuk dioptimalkan hanya dengan indeks. Indeks terbaik adalah yang dimulai dengan published dan kemudian memiliki kolom lainnya -- tidak jelas urutannya seperti apa. Alasannya adalah karena semua kecuali published tidak menggunakan = .

Karena masalah kinerja Anda sedang diurutkan, itu menunjukkan bahwa banyak baris yang dikembalikan. Biasanya, indeks digunakan untuk memenuhi WHERE klausa sebelum indeks dapat digunakan untuk ORDER BY . Itu membuat ini sulit untuk dioptimalkan.

Saran . . . Tidak ada yang sehebat itu:

  • Jika Anda akan mengakses data berdasarkan bulan, maka Anda dapat mempertimbangkan untuk mempartisi data berdasarkan bulan. Itu akan membuat kueri tanpa ORDER BY lebih cepat, tetapi tidak akan membantu ORDER BY .
  • Coba berbagai urutan kolom setelah published dalam indeks. Anda mungkin menemukan kolom yang paling selektif. Namun, sekali lagi, ini mempercepat kueri sebelum pengurutan.
  • Pikirkan tentang cara Anda dapat menyusun kueri untuk memiliki lebih banyak kondisi kesetaraan di WHERE klausa atau untuk mengembalikan kumpulan data yang lebih kecil.
  • (Tidak disarankan) Letakkan indeks pada published dan kolom pemesanan. Kemudian gunakan subquery untuk mengambil data. Masukkan kondisi pertidaksamaan (IN dan seterusnya) di kueri luar. Subquery akan menggunakan indeks untuk menyortir dan memfilter hasilnya.

Alasan terakhir tidak direkomendasikan adalah karena SQL (dan MySQL) tidak menjamin pengurutan hasil dari subquery. Namun, karena MySQL mewujudkan subquery, hasilnya benar-benar teratur. Saya tidak suka menggunakan efek samping yang tidak terdokumentasi, yang dapat berubah dari versi ke versi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat terhubung ke mysql melalui servlet

  2. Bagaimana cara menghitung ruang disk yang digunakan oleh tabel MySQL dari tipe data kolom dan jumlah baris?

  3. Cara Memeriksa Hak Pengguna di MySQL Workbench menggunakan GUI

  4. Doctrine 2 @Gedmo\SoftDeleteable dan bidang yang unik

  5. Bagaimana cara terhubung ke database MySQL di PHP menggunakan ekstensi mysqli?