Beberapa hal... Saya akan memiliki indeks gabungan TUNGGAL di( a_id, job, state, start_time )
Ini untuk membantu mengoptimalkan kueri pada semua kriteria, dalam apa yang saya yakini sebagai urutan yang paling sesuai. Satu "A_ID", lalu dua pekerjaan, rentang status kecil, lalu berbasis waktu. Selanjutnya, perhatikan tidak ada tanda kutip... Tampaknya Anda mengonversi perbandingan numerik ke string, biarkan sebagai numerik untuk perbandingan -- lebih cepat daripada string.
Juga, dengan memiliki semuanya sebagai bagian dari indeks, ini adalah indeks PENUTUP yang berarti TIDAK harus pergi ke data halaman mentah untuk mendapatkan nilai lain untuk menguji catatan yang memenuhi syarat untuk disertakan atau tidak.
SELECT
count(*) AS tries
FROM
tasks
WHERE
a_id = 614
AND job IN ( 1, 3 )
AND state > 80 AND state < 100
AND start_time >= 1386538013;
Sekarang, mengapa indeks... pertimbangkan skenario berikut. Anda memiliki dua kamar yang memiliki kotak... Di ruang pertama, setiap kotak adalah "a_id", di dalamnya adalah pekerjaan yang diurutkan, di dalam setiap pekerjaan adalah rentang status, dan terakhir berdasarkan waktu mulai.
Di ruangan lain, kotak Anda diurutkan berdasarkan waktu mulai, di dalam a_id itu diurutkan, dan akhirnya dinyatakan.
Yang akan lebih mudah untuk menemukan apa yang Anda butuhkan. Begitulah seharusnya Anda berpikir tentang indeks. Saya lebih suka pergi ke satu kotak untuk "A_ID =614", lalu lompat ke Pekerjaan 1 dan yang lain untuk Pekerjaan 3. Dalam setiap Pekerjaan 1, Pekerjaan 3, ambil 80-100, lalu waktu. Namun Anda lebih mengetahui data dan volume Anda dalam setiap pertimbangan kriteria dan dapat menyesuaikan.
Akhirnya, count(ID) vs count(*). Yang saya pedulikan hanyalah rekor yang memenuhi syarat. Saya tidak perlu mengetahui ID sebenarnya karena kriteria pemfilteran sudah memenuhi syarat sebagai termasuk atau tidak, mengapa mencari (dalam hal ini) "ID" yang sebenarnya.