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

MySQL dengan JOIN tidak menggunakan indeks

Saya tidak tahu perbedaan yang Anda lihat di penginstalan sebelumnya dan saat ini, tetapi perilaku server masuk akal.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id )  ORDER BY  test_events.create_time DESC LIMIT 1; 

Dalam kueri ini Anda tidak memiliki klausa where tetapi Anda hanya mengambil satu baris. Dan itu setelah mengurutkan berdasarkan create_time yang kebetulan memiliki index. Dan indeks itu bisa digunakan untuk menyortir. Tapi mari kita lihat kueri kedua.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id ) WHERE base = 314 ORDER BY  test_events.create_time DESC LIMIT 1

Anda tidak memiliki indeks di kolom dasar. Jadi tidak ada indeks yang dapat digunakan untuk itu. Untuk menemukan catatan yang relevan mysql harus melakukan pemindaian tabel. Setelah mengidentifikasi baris yang relevan, mereka perlu diurutkan. Namun dalam kasus ini perencana kueri telah memutuskan bahwa tidak layak menggunakan indeks pada create_time

Saya melihat beberapa masalah dengan pengaturan Anda, yang pertama tidak memiliki dan mengindeks di base seperti yang sudah disebutkan. Tapi mengapa basis varchar? Anda tampaknya menyimpan bilangan bulat di dalamnya.

ALTER TABLE test_events
  ADD PRIMARY KEY (id),
  ADD KEY client (client),
  ADD KEY event_time (event_time),
  ADD KEY manager (manager),
  ADD KEY base_id (base_id),
  ADD KEY create_time (create_time);

Dan membuat banyak indeks seperti ini tidak masuk akal di mysql. Itu karena mysql hanya dapat menggunakan satu indeks per tabel untuk kueri. Anda akan jauh lebih baik dengan satu atau dua indeks. Mungkin indeks multi kolom.

Saya pikir indeks ideal Anda akan berisi bidang create_time dan event



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menguji pernyataan Pembaruan SQL sebelum menjalankannya?

  2. Redirect file .gif mentah ke halaman handler melalui .htacces

  3. Contoh Pernyataan JDBC – Sisipkan Batch, Perbarui, Hapus

  4. PDOException SQLSTATE[HY000] [2002] Tidak ada file atau direktori seperti itu

  5. Menyembunyikan pesan kesalahan PHP / MySQL