Apakah ide yang baik untuk mengindeks bidang datetime di mysql?

137

Saya sedang bekerja merancang database besar. Dalam aplikasi saya, saya akan memiliki banyak baris misalnya saat ini saya memiliki satu tabel dengan 4 juta catatan. Sebagian besar pertanyaan saya menggunakan klausa datetime untuk memilih data. Apakah ide yang baik untuk mengindeks bidang datetime di database mysql?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

Saya mencoba untuk menjaga agar database saya berfungsi dengan baik dan pertanyaan berjalan dengan lancar

Selain itu, menurut Anda, ide apa yang harus saya buat untuk membuat database efisiensi tinggi?

Jaylen
sumber
Apa field 20?
AlikElzin-kilaka

Jawaban:

164

MySQL merekomendasikan penggunaan indeks untuk berbagai alasan termasuk penghapusan baris antara kondisi: http://dev.mysql.com/doc/refman/5.0/id/mysql-indexes.html

Ini menjadikan kolom datetime Anda kandidat yang sangat baik untuk indeks jika Anda akan menggunakannya dalam kondisi yang sering dalam kueri. Jika satu-satunya kondisi BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)Anda dan Anda tidak memiliki indeks lain dalam kondisi tersebut, MySQL harus melakukan pemindaian tabel penuh pada setiap kueri. Saya tidak yakin berapa banyak baris yang dihasilkan dalam 30 hari, tetapi selama kurang dari 1/3 dari total baris akan lebih efisien untuk menggunakan indeks pada kolom.

Pertanyaan Anda tentang membuat database yang efisien sangat luas. Saya akan mengatakan untuk memastikan bahwa itu dinormalisasi dan semua kolom yang sesuai diindeks (yaitu yang digunakan dalam bergabung dan di mana klausa).

Pil Ledakan
sumber
3
Terima kasih atas penjelasannya. Itu sangat membantu. Saya yakin saya akan memiliki lebih banyak filter untuk itu. Saya hanya ingin memastikan bidang pengindeksan datetime adalah ide yang baik atau tidak karena kami mungkin memiliki waktu duplikat waktu. tetapi jawaban Anda menjelaskannya :) Terima kasih
Jaylen
4
+1 untuk 'yang digunakan bersama dan di mana klausa'. Aturan praktis yang bagus untuk strategi pengindeksan. Jelas sekarang saya memikirkannya, tetapi tidak terpikir oleh saya sebelumnya
Gaz_Edge
1
Tetapi jika Anda meminta data dengan rentang tanggal , seperti rentang data dari "2017-01-01 11:20" hingga "2018-01-03 12:12", itu tidak membuat SELECTkueri lebih cepat meskipun saya mengindeks date timekolom. .. index membuat query dengan cepat ketika saya menggunakan equaloperasi .. Apakah saya benar?
user3595632
1
Bagaimana jika menanyakan bidang datetime dengan fungsi waktu seperti DAY (datetime) atau HOUR (datetime). Apakah indeks akan membantu atau menghalangi dalam hal ini?
cronoklee
hi @Explosion Pills, jika saya hanya perlu query tabel berdasarkan tahun dan bulan, apakah saya akan mendapatkan kinerja yang lebih baik jika saya membuat kolom baru dengan hanya tahun dan bulan kemudian indeks itu, daripada membuat indeks kolom datetime secara langsung ? Seperti itulah saya membuat kolom yang nilainya seperti 201801.
Woods Chen
18

Di sini penulis melakukan tes menunjukkan bahwa timestamp unix integer lebih baik daripada DateTime. Catatan, dia menggunakan MySql. Tapi saya merasa tidak peduli mesin DB apa yang Anda gunakan membandingkan bilangan bulat sedikit lebih cepat daripada membandingkan tanggal sehingga indeks int lebih baik daripada indeks DateTime. Ambil T1 - waktu membandingkan 2 tanggal, T2 - waktu membandingkan 2 bilangan bulat. Pencarian di bidang yang diindeks membutuhkan waktu sekitar O (log (baris)) karena indeks berdasarkan pada pohon seimbang - mungkin berbeda untuk mesin DB yang berbeda tetapi bagaimanapun, Log (baris) adalah estimasi umum. (jika Anda tidak menggunakan indeks berbasis bitmask atau r-tree). Jadi perbedaannya adalah (T2-T1) * Log (baris) - dapat berperan jika Anda sering melakukan kueri.

Baurzhan
sumber
Terima kasih. Saya memikirkan hal itu sebagai pilihan tetapi tidak tahu bagaimana cara mendekatinya. Saya percaya Anda adalah bilangan bulat benar selalu lebih cepat.
Jaylen
62
Lebih baik? Saya ragu cap waktu unix lebih baik untuk semua kasus. Ya, menyimpan integer umumnya lebih cepat daripada menyimpan string, tetapi bagaimana dengan semua fungsi DateTime yang ditampilkan MySQL? Menerapkannya sendiri akan berdampak negatif pada kinerja atau fungsionalitas.
Greg