Pahami persyaratan Anda sebelum merancang skema (jika mungkin).
Pelajari tentang data, 1) pengindeksan 2) jenis penyimpanan yang digunakan, 3) mesin atau fitur vendor; yaitu ... caching, kemampuan dalam memori 4) tipe data 5) ukuran tabel 6) frekuensi kueri 7) beban kerja terkait jika sumber daya dibagi 8) Uji
A) Persyaratan akan bervariasi. Jika perangkat keras tidak dapat mendukung beban kerja yang diharapkan, Anda harus mengevaluasi kembali cara menyediakan persyaratan dalam beban kerja. Mengenai kolom tambahan ke tabel. Jika database mendukung tampilan, Anda dapat membuat tampilan indeks (?) Yang diindeks dari data spesifik dengan kolom bernama tertentu (vs. pilih '*'). Tinjau data dan skema Anda secara berkala untuk memastikan Anda tidak pernah mengalami sindrom "Sampah" -> "Sampah".
Dengan asumsi tidak ada solusi lain; Anda dapat mempertimbangkan yang berikut ini. Selalu ada beberapa solusi untuk suatu masalah.
1) Pengindeksan: Select * akan menjalankan tablescan. Bergantung pada berbagai faktor, ini mungkin melibatkan pencarian disk dan / atau pertikaian dengan pertanyaan lain. Jika tabelnya multi-guna, pastikan semua kueri berkinerja dan jalankan di bawah target waktu Anda. Jika ada sejumlah besar data, dan jaringan Anda atau sumber daya lainnya tidak dicari; Anda perlu mempertimbangkan ini. Basis data adalah lingkungan bersama.
2) jenis penyimpanan. Yaitu: jika Anda menggunakan SSD, disk, atau memori. Waktu I / O dan beban pada sistem / cpu akan bervariasi.
3) Dapatkah DBA menyesuaikan database / tabel untuk kinerja yang lebih tinggi? Dengan asumsi untuk alasan apa pun, tim telah memutuskan pilih '*' adalah solusi terbaik untuk masalah tersebut; dapatkah DB atau tabel dimuat ke dalam memori. (Atau metode lain ... mungkin respons dirancang untuk merespons dengan jeda 2-3 detik? --- saat iklan diputar untuk mendapatkan pendapatan perusahaan ...)
4) Mulai dari garis dasar. Pahami tipe data Anda, dan bagaimana hasilnya akan disajikan. Tipe data yang lebih kecil, jumlah bidang mengurangi jumlah data yang dikembalikan dalam set hasil. Ini membuat sumber daya tersedia untuk kebutuhan sistem lain. Sumber daya sistem biasanya memiliki batas; 'selalu' bekerja di bawah batas ini untuk memastikan stabilitas, dan perilaku yang dapat diprediksi.
5) ukuran tabel / data. pilih '*' adalah umum dengan tabel kecil. Biasanya sesuai dengan memori, dan waktu responsnya cepat. Sekali lagi .... tinjau kebutuhan Anda. Paket untuk fitur creep; selalu rencanakan untuk kebutuhan saat ini dan kemungkinan masa depan.
6) Frekuensi kueri / kueri. Waspadai beban kerja lain pada sistem. Jika kueri ini menyala setiap detik, dan tabelnya kecil. Set hasil dapat dirancang untuk tetap dalam cache / memori. Namun, jika kueri adalah proses batch yang sering dengan data Gigabytes / Terabyte ... Anda mungkin lebih baik mendedikasikan sumber daya tambahan untuk memastikan beban kerja lainnya tidak terpengaruh.
7) beban kerja terkait. Memahami bagaimana sumber daya digunakan. Apakah jaringan / sistem / database / tabel / aplikasi dikhususkan, atau dibagikan? Siapa saja para pemangku kepentingan? Apakah ini untuk produksi, pengembangan, atau QA? Apakah ini "perbaikan cepat" sementara. Sudahkah Anda menguji skenario? Anda akan terkejut betapa banyak masalah yang bisa ada pada perangkat keras saat ini. (Ya, kinerjanya cepat ... tetapi desain / kinerjanya masih menurun.) Apakah sistem perlu menjalankan 10K kueri per detik vs 5-10 kueri per detik. Apakah server basis data didedikasikan, atau melakukan aplikasi lain, pemantauan dijalankan pada sumber daya bersama. Beberapa aplikasi / bahasa; O / S akan mengkonsumsi 100% dari memori menyebabkan berbagai gejala / masalah.
8) Uji: Uji teori Anda, dan pahami sebanyak mungkin tentang Anda. Masalah '*' pilihan Anda mungkin merupakan masalah besar, atau mungkin sesuatu yang bahkan tidak perlu Anda khawatirkan.
SELECT COUNT(*)
menjadi buruk itu sangat tua dan ketinggalan jaman . Untuk info tentangSELECT *
- lihat: stackoverflow.com/questions/1960036/…