Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 12934|Jawab: 2

[Kiat] Beberapa metode umum untuk mengoptimalkan kueri pernyataan SQL di MySQL

[Salin tautan]
Diposting pada 04/08/2017 16.08.46 | | |
1. Untuk mengoptimalkan kueri, Anda harus mencoba menghindari pemindaian tabel penuh, dan pertama-tama mempertimbangkan untuk membuat indeks pada kolom yang terlibat dalam di mana dan urutkan berdasarkan.

2. Cobalah untuk menghindari penggunaan operator != atau <> dalam klausa where, jika tidak, mesin akan meninggalkan penggunaan indeks dan melakukan pemindaian tabel penuh.

3. Cobalah untuk menghindari penilaian nilai nol pada bidang dalam klausa where, jika tidak, mesin akan meninggalkan penggunaan indeks dan melakukan pemindaian tabel penuh, seperti:
Pilih id dari t di mana num adalah null
Anda dapat mengatur nilai default 0 pada num, pastikan tidak ada nilai null di kolom num dalam tabel, lalu kueri seperti ini:
Pilih ID dari t di mana num=0

4. Anda harus mencoba menghindari penggunaan OR dalam klausa where untuk menggabungkan kondisi, jika tidak, itu akan menyebabkan mesin meninggalkan penggunaan indeks dan melakukan pemindaian tabel penuh, seperti:
Pilih ID dari t di mana num=10 atau num=20
Anda dapat melakukan kueri seperti ini:
Pilih ID dari t di mana num=10
serikat semua
Pilih ID dari t di mana num=20

5. Kueri berikut juga akan menghasilkan pemindaian tabel penuh:
Pilih ID dari t di mana nama seperti '%abc%'
Untuk meningkatkan efisiensi, pertimbangkan pencarian teks lengkap.

6.in dan tidak harus digunakan dengan hati-hati, jika tidak maka akan menyebabkan pemindaian meja penuh, seperti:
Pilih ID dari t di mana num in(1,2,3)
Untuk nilai berkelanjutan, jangan gunakan dalam jika Anda dapat menggunakan antara:
Pilih ID dari t di mana num antara 1 dan 3

7. Jika Anda menggunakan parameter dalam klausa where, itu juga akan menyebabkan pemindaian tabel penuh. Karena SQL hanya menyelesaikan variabel lokal saat runtime, tetapi pengoptimal tidak dapat menunda pemilihan paket akses ke runtime; Itu harus dipilih pada waktu kompilasi. Namun, jika rencana akses dibuat pada waktu kompilasi, nilai variabel masih belum diketahui dan oleh karena itu tidak dapat digunakan sebagai item input untuk pemilihan indeks. Pernyataan berikut akan dipindai secara lengkap:
Pilih ID dari t di mana num=@num
Anda dapat memaksa kueri untuk menggunakan indeks sebagai gantinya:
Pilih ID dari t dengan(indeks(indeks(nama indeks)) di mana num=@num

8. Cobalah untuk menghindari mengekspresikan bidang dalam klausa where, yang akan menyebabkan mesin meninggalkan penggunaan indeks demi pemindaian tabel penuh. Sebagai contoh:
Pilih ID dari t di mana num/2=100
harus diubah menjadi:
Pilih ID dari t di mana num=100*2

9. Cobalah untuk menghindari melakukan operasi fungsi pada bidang dalam klausa where, yang akan menyebabkan mesin meninggalkan penggunaan indeks demi pemindaian tabel penuh. Sebagai contoh:
Pilih id dari t di mana substring(name,1,3)='abc' --name id yang dimulai dengan abc
Pilih ID dari t di mana datediff(day,createdate,'2005-11-30')=0--'2005-11-30' menghasilkan id
harus diubah menjadi:
Pilih ID dari t di mana nama seperti 'abc%'
Pilih ID dari t Where Createdate>='2005-11-30' dan Createdate<'2005-12-1'

10. Jangan melakukan fungsi, operasi aritmatika, atau operasi ekspresi lainnya di sebelah kiri "=" dalam klausa where, jika tidak, sistem mungkin tidak dapat menggunakan indeks dengan benar.

11. Saat menggunakan bidang indeks sebagai kondisi, jika indeks adalah indeks komposit, maka bidang pertama dalam indeks harus digunakan sebagai kondisi untuk memastikan bahwa sistem menggunakan indeks, jika tidak, indeks tidak akan digunakan, dan urutan bidang harus konsisten dengan urutan indeks sebanyak mungkin.

12. Jangan menulis beberapa kueri yang tidak berarti, seperti membuat struktur tabel kosong:
Pilih col1,col2 ke dalam #t dari t di mana 1=0
Jenis kode ini tidak mengembalikan kumpulan hasil apa pun, tetapi menggunakan sumber daya sistem, jadi harus diubah menjadi seperti ini:
membuat tabel #t(...)

13. Sering kali ini adalah pilihan yang baik untuk mengganti dengan ada:
Pilih Num dari A Tempat Num In(Pilih Num dari B)
Ganti dengan pernyataan berikut:
pilih num dari a where exists(pilih 1 dari b di mana num=a.num)

14. Tidak semua indeks valid untuk kueri, SQL didasarkan pada data dalam tabel untuk mengoptimalkan kueri, ketika kolom indeks memiliki duplikasi data dalam jumlah besar, kueri SQL mungkin tidak menggunakan indeks, seperti tabel memiliki jenis kelamin bidang, laki-laki, perempuan masing-masing hampir setengahnya, maka meskipun indeks dibangun berdasarkan jenis kelamin, itu tidak akan berperan dalam efisiensi kueri.

15. Semakin banyak indeks tidak semakin baik, indeks tentu dapat meningkatkan efisiensi pilihan yang sesuai, tetapi juga mengurangi efisiensi sisipan dan pembaruan, karena indeks dapat dibangun kembali saat dimasukkan atau diperbarui, jadi cara membangun indeks perlu dipertimbangkan dengan cermat, tergantung pada situasi tertentu. Yang terbaik adalah tidak memiliki lebih dari 6 indeks dalam tabel, dan jika ada terlalu banyak, pertimbangkan apakah perlu membangun indeks pada beberapa kolom yang jarang digunakan.

16. Hindari memperbarui kolom data indeks berkluster sebanyak mungkin, karena urutan kolom data indeks berkluster adalah urutan penyimpanan fisik rekaman tabel, dan setelah nilai kolom berubah, itu akan mengarah pada penyesuaian urutan seluruh catatan tabel, yang akan menghabiskan sumber daya yang cukup besar. Jika aplikasi Anda perlu sering memperbarui kolom indeks berkluster, Anda perlu mempertimbangkan apakah Anda harus membuat indeks sebagai indeks berkluster.

17. Cobalah untuk menggunakan bidang numerik, dan cobalah untuk tidak mendesain bidang yang hanya berisi informasi numerik sebagai karakter, yang akan mengurangi kinerja kueri dan koneksi, dan meningkatkan overhead penyimpanan. Ini karena mesin membandingkan setiap karakter dalam string satu per satu saat memproses kueri dan gabungan, sedangkan untuk jenis numerik, hanya perlu dibandingkan sekali.

18. Gunakan varchar/nvarchar alih-alih char/nchar sebanyak mungkin, karena pertama, ruang penyimpanan lapangan yang lebih panjang dapat menghemat ruang penyimpanan, dan kedua, untuk kueri, efisiensi pencarian di bidang yang relatif kecil jelas lebih tinggi.

19. Jangan gunakan pilih * dari t di mana saja, ganti "*" dengan daftar bidang tertentu, dan jangan mengembalikan bidang apa pun yang tidak digunakan.

20. Cobalah untuk menggunakan variabel tabel alih-alih tabel sementara. Jika variabel tabel berisi data dalam jumlah besar, perhatikan bahwa indeksnya sangat terbatas (hanya indeks kunci primer).

21. Hindari sering membuat dan menghapus tabel sementara untuk mengurangi konsumsi sumber daya tabel sistem.

22. Tabel sementara tidak dapat digunakan, dan menggunakannya dengan tepat dapat membuat beberapa rutinitas lebih efektif, misalnya, ketika Anda perlu berulang kali mereferensikan himpunan data dalam tabel besar atau tabel yang umum digunakan. Namun, untuk peristiwa satu kali, sebaiknya gunakan tabel ekspor.

23. Saat membuat tabel sementara, jika jumlah data yang disisipkan pada satu waktu besar, maka Anda dapat menggunakan pilih ke alih-alih membuat tabel untuk menghindari menyebabkan sejumlah besar log meningkatkan kecepatan; Jika jumlah data tidak besar, untuk memudahkan sumber daya tabel sistem, Anda harus membuat tabel terlebih dahulu dan kemudian menyisipkan.

24. Jika tabel sementara digunakan, pastikan untuk secara eksplisit menghapus semua tabel sementara di akhir prosedur yang disimpan, potong tabel terlebih dahulu, lalu jatuhkan tabel, untuk menghindari tabel sistem terkunci untuk waktu yang lama.

25. Cobalah untuk menghindari penggunaan kursor, karena efisiensi kursor buruk, jika data yang dioperasikan oleh kursor melebihi 10.000 baris, maka Anda harus mempertimbangkan untuk menulis ulang.

26. Solusi berbasis set harus dicari untuk memecahkan masalah sebelum menggunakan metode tabel berbasis kursor atau sementara, yang seringkali lebih efektif.

27. Seperti tabel sementara, kursor tidak dapat digunakan. Menggunakan kursor FAST_FORWARD untuk himpunan data kecil seringkali lebih baik daripada metode pemrosesan baris demi baris lainnya, terutama jika Anda harus mereferensikan beberapa tabel untuk mendapatkan data yang Anda butuhkan. Rutinitas yang menyertakan "total" dalam kumpulan hasil biasanya lebih cepat daripada yang dijalankan dengan kursor. Jika waktu pengembangan memungkinkan, metode berbasis kursor dan berbasis set dapat dicoba untuk melihat mana yang bekerja lebih baik.

28. Atur SET NOCOUNT ON di awal semua prosedur dan pemicu yang disimpan, dan SET NOCOUNT OFF di akhir. Tidak perlu mengirim pesan DONE_IN_PROC ke klien setelah menjalankan setiap pernyataan prosedur dan pemicu yang disimpan.

29. Cobalah untuk menghindari pengembalian data besar ke klien, jika volume data terlalu besar, pertimbangkan apakah permintaan yang sesuai masuk akal.

30. Cobalah untuk menghindari operasi transaksi besar dan meningkatkan kemampuan konkurensi sistem.

Skor

Jumlah peserta1MB+5 sumbang+5 Roboh alasan
Sampah kecil + 5 + 5 Hadiah Program Pisang

Lihat semua penilaian





Mantan:Tips untuk kueri grup menurut grup
Depan:Sampai jumpa pada pukul 8:30 pada hari Minggu, 6 Agustus 2017 di Grand Mansion di Ruima
 Tuan tanah| Diposting pada 04/08/2017 16.14.30 |
Prinsip pengoptimalan: tabel kecil mendorong tabel besar, yaitu himpunan data kecil mendorong himpunan data besar.
 Tuan tanah| Diposting pada 04/08/2017 16.22.14 |
Untuk meningkatkan kecepatan kueri, buat indeks yang wajar seperti
PILIH a.goods_name,a.goods_number,a.goods_price,a.goods_track,b.payment,b.confirm_time,b.pay_status,b.id,b.sn,b.ware_house,b.total_amount,b.final_amount,b.cpns_amount ,b.sale_amount,b.cost_amount,'goods_count','pay_status',b.ship_status,b.createtime,b.pembayaran,b.order_status,b.pay_time,b.shr_name,b.shr_phone,b.shr_province,b.shr_ telepon, b.shr_province, b.shr_city, b.shr_area, b.shr_address, b.remark, b.order_from, b.send_time, b.pay_sn, c.spec_info, c.cost_price, d.company, d.list, d.is_error, e.shop_sn sebagai goods_sn DARI sh_order_goods a kiri bergabung sh_order b pada a.order_id=b.id kiri bergabung sh_product c pada a.product_id=c.id kiri bergabung sh_send d pada a.order_id=d.order_id kiri bergabung sh_goods e di a.goods_ id=e.id ORDER BY id DESC
Meskipun kueri data semacam ini dapat mencapai fungsi, jika menemukan jutaan volume data, itu akan menyebabkan batas waktu, yang secara serius dapat menyebabkan keruntuhan layanan. Prinsipnya adalah 1000 * 1000 * 1000, lambat dapat dibayangkan, coba gunakan satu tabel untuk memeriksa data, lakukan penambahan. Secara khusus, e-commerce adalah pertanyaan bersama yang paling tabu.
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com