Anda bertanya " mengapa ini terlalu lama ?". Anda juga berkata " Sayangnya, ini membutuhkan waktu lebih dari 5 detik untuk mengambil data dan menunjukkannya kepada saya ". Juga, Anda melaporkan keluaran profil dari kueri Anda.
Seperti yang Anda lihat sendiri, jumlah waktu yang dilaporkan oleh profiler untuk setiap langkah dihitung hingga 0,000154 detik. Jadi, dari sudut pandang profiler, kueri diselesaikan dalam waktu seperti itu (0,000154).
Jadi mengapa Anda mendapatkan hasil dalam " ... lebih dari 5 detik? ".
Anda bilang Anda memfilter tabel catatan 23 juta dengan bidang 3 char. Sayangnya Anda tidak memberi tahu kami berapa banyak rekaman yang dikembalikan kueri Anda ... tetapi berkat EXPLAIN SELECT yang disediakan, sepertinya kueri Anda mengembalikan 336052 catatan.
Tampaknya juga semua aktivitas Anda dijalankan melalui beberapa GUI (PHPMyAdmin?).
Jadi, setelah semua hal di atas, kami dapat merumuskan kembali pertanyaan awal Anda sebagai:
"Mengapa saya mendapatkan, dalam GUI saya, 336.052 catatan ditampilkan dalam lebih dari 5 detik, jika waktu eksekusi MySQL untuk permintaan terkait adalah 0,000154 detik?"
Jawabannya, menurut saya, cukup sederhana: 5 detik adalah waktu (benar-benar rendah, memang) untuk membiarkan 336.052 catatan berjalan di sepanjang jalur: mesin MySQL => MySQL client libraries => PHP modul MySQL => Apache => Network = > tumpukan TCP / IP PC Anda => Browser => parser / builder DOM / dll. => Halaman HTML yang di-render.
Adapun pengalaman saya sebelumnya, waktu yang dibutuhkan oleh transmisi hasil "biasanya" jauh lebih tinggi daripada waktu yang dibutuhkan untuk mengambil data tersebut. Ini berlaku terutama ketika perpustakaan seperti PHP-MySQL atau Perl-DBD-MySQL terlibat: mereka benar-benar membutuhkan banyak waktu untuk mengambil catatan, setelah MySQL telah mengidentifikasi (... dan mengekstraksi) semuanya dengan benar.
Bagaimana cara mengatasi masalah ini?
Sekali lagi, cukup mudah: apakah Anda benar-benar yakin bahwa Anda memerlukan SEMUA catatan 336.052, dalam satu set data, keseluruhan,?
Jika jawaban Anda benar-benar "YA! Saya membutuhkan semuanya", daripada aplikasi Anda akan menangani PAGINASI dan / atau PENGGUNA-Interaksi dengan sendirinya dan ... setelah mengumpulkan semua data seperti itu, mungkin akan menghabiskan banyak waktu berinteraksi dengan pengguna tanpa memerlukan interaksi MySQL lebih lanjut. Dalam kasus seperti itu, menunggu selama 5 detik (atau bahkan lebih) seharusnya tidak menjadi masalah;
Jika jawaban Anda adalah "TIDAK, saya ingin berurusan dengan ukuran dataset yang lebih 'manusia'", daripada Anda harus mempersempit kueri Anda (setidaknya) sehingga itu akan memberi Anda lebih banyak dataset "manusia" (puluhan atau, ratusan, paling banyak, catatan). Dalam kasus seperti itu, saya yakin Anda akan mendapatkan hasil Anda dalam waktu yang lebih singkat.
BTW: ini adalah masalah yang sama persis dengan yang Anda alami di posting lain ini , di ServerFault: 88 detik untuk membiarkan 132M catatan perjalanan sepanjang .... jalur sihir tidak terkait mysql :-)