View a markdown version of this page

Panduan untuk penyetelan kueri - AWS Bimbingan Preskriptif

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Panduan untuk penyetelan kueri

Setelah Anda mengidentifikasi kueri bermasalah dalam beban kerja Anda, setiap kueri harus disetel. Gunakan panduan penyetelan berikut untuk membantu beban kerja Anda berjalan lebih efisien.

Minimalkan jumlah baris yang dipindai

Sepertinya dasar, ini adalah saran yang bagus untuk digunakan saat Anda menyetel kueri. Gunakan pernyataan EXPLOW, dan tinjau kolom baris untuk melihat berapa banyak baris yang dipindai pengoptimal pada setiap gabungan. Cobalah untuk mengurangi jumlah baris yang dipindai dengan membuat indeks optimal, lalu jelaskan kembali kueri Anda untuk mengonfirmasi pekerjaan Anda. Untuk informasi selengkapnya, lihat dokumentasi MySQL.

Jika Anda menggunakan tabel yang dipartisi, selalu kueri dengan klausa WHERE yang memungkinkan pemangkasan partisi sehingga pengoptimal tidak harus memindai setiap partisi. Jika klausa WHERE Anda berisi konstanta untuk kolom yang dipartisi, pengoptimal mengetahui partisi mana yang harus dicari, dan ini membuat kueri Anda lebih efisien.

Aspek lain dari saran ini adalah desain database Anda. Semakin sedikit tabel dalam kueri Anda, semakin cepat kueri Anda. Jika Anda dapat mendenormalisasi desain database Anda, Anda bisa mendapatkan pengoptimal untuk memindai lebih sedikit baris, menghasilkan kinerja kueri yang lebih cepat.

Minimalkan penggunaan tabel sementara dan tabel sementara pada disk

Pengoptimal yang kompatibel dengan Aurora MySQL membuat tabel sementara baik pada RAM maupun pada disk jika tidak bisa mendapatkan hasil yang diinginkan dari kueri Anda langsung dari indeks. Akibatnya, sebagian besar penyetelan adalah memiliki indeks yang tepat yang melayani beban kerja Anda. Namun, mungkin ada kueri dalam beban kerja Anda yang tidak dapat hanya mengandalkan indeks, sehingga beberapa operasi mungkin dilakukan dalam file sementara. Ini baik-baik saja selama Anda menyimpannya seminimal mungkin, dan Anda memastikan bahwa sangat sedikit tabel yang dibuat pada disk. MySQL membuat tabel disk ketika ukuran tabel sementara terlalu besar untuk disimpan di memori. Logika yang MySQL gunakan untuk memeriksa ukuran tabel sementara internal adalah yang lebih kecil dari dua nilai variabel tmp_table_size dan. max-heap-table-size Anda dapat menyetel variabel-variabel ini ke nilai optimal berdasarkan beban kerja Anda sehingga dalam kasus di mana Anda tidak dapat mencegah tabel sementara, Anda mendorongnya ke disk hanya pada kesempatan langka.

Hindari jenis file

Jika beban kerja Anda memiliki banyak ORDER BY kueri, cara terbaik untuk menyelesaikannya adalah dengan menggunakan indeks yang tepat pada tabel Anda. Pastikan indeks multicolumn Anda dirancang dengan baik untuk menghindari penyortiran file. Penyortiran tidak dapat terjadi pada kolom jika kolom sebelumnya tidak dipindai dengan konstanta (in,,, > <!=, dan tidak BETWEEN akan mengizinkan pengurutan pada kolom berikutnya ke kanan). Cara optimal untuk mengurutkan di MySQL adalah dengan menempatkan indeks multicolumn yang memposisikan kolom yang berisi nilai konstan yang disediakan dalam kueri di sebelah kiri kolom penyortiran dalam struktur yang berdekatan. Jika dalam upaya terakhir, kueri Anda tidak dapat mengembalikan hasil tanpa pengurutan file, pindahkan penyortiran ke aplikasi.

Hindari menjalankan kueri agregasi pada konkurensi tinggi

Beban kerja Anda mungkin memiliki sejumlah kecil kueri agregasi untuk memenuhi beberapa fungsi dalam aplikasi Anda. Kasus penggunaan ini membutuhkan banyak kehati-hatian. Mesin InnoDB diarahkan untuk pemuatan pemrosesan transaksi online (OLTP) yang tepat, tetapi bahkan beberapa kueri kelompok-demi pada konkurensi tinggi bisa sangat berat pada CPU dan dapat dengan cepat menurunkan kinerja cluster Anda. Untuk mengatasi kasus penggunaan di mana Anda memerlukan kumpulan hasil agregat, pra-agregat data dalam tabel siap baca sehingga Anda dapat menghindari grup berdasarkan kueri sama sekali.

Uji kueri Anda untuk konkurensi

Saat menyetel kueri individual, ingatlah bahwa kueri ini berjalan bersamaan pada beberapa v di CPUs Aurora yang kompatibel dengan MySQL. Kueri Anda mungkin berjalan dalam beberapa milidetik di lingkungan pengujian Anda dalam satu kali proses. Tapi ini bukan gambaran keseluruhannya. Pastikan untuk menguji kueri Anda dengan tingkat konkurensi yang diharapkan pada klaster produksi Anda dan benchmark kinerjanya. Lepaskan kueri ke produksi hanya jika memenuhi tujuan konkurensi Anda. Pastikan Anda menggunakan pengoptimal hint sql_no_cache dalam skrip pengujian Anda sehingga Anda menghindari pengambilan hasil dari cache. Anda dapat menggunakan alat seperti mysqlslap untuk melakukan tes pada konkurensi dan benchmark hasilnya.