Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Praktik terbaik untuk SQL kinerja dan penskalaan Aurora My
Anda dapat menerapkan praktik terbaik berikut untuk meningkatkan kinerja dan skalabilitas cluster Aurora SQL My Anda.
Topik
- Menggunakan kelas instans T untuk pengembangan dan pengujian
- Mengoptimalkan Aurora Kueri gabungan SQL saya yang diindeks dengan prefetch kunci asinkron
- Mengoptimalkan Aurora besar Kueri bergabung SQL saya dengan gabungan hash
- Menggunakan Amazon Aurora untuk menskalakan bacaan untuk database Saya SQL
- Mengoptimalkan operasi stempel waktu
Menggunakan kelas instans T untuk pengembangan dan pengujian
Amazon Aurora My SQL instans yang menggunakandb.t2
,db.t3
, atau kelas instans db.t4g
DB paling cocok untuk aplikasi yang tidak mendukung beban kerja tinggi untuk waktu yang lama. Instans T dirancang untuk memberikan performa dasar sedang dan kemampuan untuk melakukan burst performa yang secara signifikan lebih tinggi sesuai dengan yang dibutuhkan beban kerja Anda. Mereka dimaksudkan untuk beban kerja yang tidak CPU sering digunakan secara penuh atau konsisten, tetapi kadang-kadang perlu meledak. Kami menyarankan penggunaan kelas instans DB T hanya untuk server pengembangan dan pengujian, atau server non-produksi lainnya. Untuk detail selengkapnya tentang kelas instans T, lihat Instans performa yang dapat melonjak.
Jika klaster Aurora Anda lebih besar dari 40 TB, jangan gunakan kelas instans T. Ketika basis data Anda memiliki volume data yang besar, overhead memori untuk mengelola objek skema dapat melebihi kapasitas instans T.
Jangan aktifkan Skema SQL Kinerja Saya di Amazon Aurora SQL My T instans. Jika Skema Performa diaktifkan, instans ini dapat kehabisan memori.
Tip
Jika database Anda terkadang menganggur tetapi di lain waktu memiliki beban kerja yang besar, Anda dapat menggunakannya Aurora Serverless v2 sebagai alternatif untuk contoh T. Dengan Aurora Serverless v2, Anda menentukan rentang kapasitas dan Aurora secara otomatis menskalakan database Anda ke atas atau ke bawah tergantung pada beban kerja saat ini. Untuk detail penggunaan, lihat Menggunakan Aurora Serverless v2. Untuk versi mesin database yang dapat Anda gunakan Aurora Serverless v2, lihat Persyaratan dan batasan untuk Aurora Serverless v2.
Saat Anda menggunakan instans T sebagai instans DB di cluster Aurora My SQL DB, kami merekomendasikan hal berikut:
-
Gunakan kelas instans DB yang sama untuk semua instans di klaster DB Anda. Misalnya, jika Anda menggunakan
db.t2.medium
untuk instans penulis Anda, maka kami sarankan Anda menggunakandb.t2.medium
untuk instans pembaca Anda juga. -
Jangan sesuaikan pengaturan konfigurasi terkait memori apa pun, seperti
innodb_buffer_pool_size
. Aurora menggunakan serangkaian nilai default yang sudah sangat disesuaikan untuk buffer memori pada instans T. Default khusus ini diperlukan agar Aurora dapat berjalan pada instans yang dibatasi memori. Jika Anda mengubah pengaturan terkait memori pada instance T, Anda jauh lebih mungkin menghadapi out-of-memory kondisi, bahkan jika perubahan Anda dimaksudkan untuk meningkatkan ukuran buffer. -
Pantau Saldo CPU Kredit Anda (
CPUCreditBalance
) untuk memastikan bahwa itu berada pada tingkat yang berkelanjutan. Artinya, CPU kredit diakumulasikan pada tingkat yang sama dengan yang digunakan.Ketika Anda telah kehabisan CPU kredit untuk sebuah contoh, Anda melihat penurunan langsung dalam tersedia CPU dan peningkatan latensi baca dan tulis untuk contoh tersebut. Situasi ini menyebabkan penurunan yang parah dalam performa keseluruhan instans.
Jika saldo CPU kredit Anda tidak pada tingkat yang berkelanjutan, maka sebaiknya Anda memodifikasi instans DB Anda untuk menggunakan salah satu kelas instans R DB yang didukung (komputasi skala).
Untuk informasi selengkapnya tentang pemantauan metrik, lihat Melihat metrik di konsol Amazon RDS.
-
Pantau lag replika (
AuroraReplicaLag
) antara instans penulis dan instans pembaca.Jika instance pembaca kehabisan CPU kredit sebelum instance penulis melakukannya, lag yang dihasilkan dapat menyebabkan instance pembaca sering restart. Hasil ini biasa terjadi jika aplikasi memiliki beban operasi baca berat yang didistribusikan di antara instans pembaca, pada waktu yang sama saat instans penulis memiliki beban operasi tulis minimal.
Jika Anda melihat peningkatan kelambatan replika yang berkelanjutan, pastikan saldo CPU kredit Anda untuk instance pembaca di cluster DB Anda tidak habis.
Jika saldo CPU kredit Anda tidak pada tingkat yang berkelanjutan, maka sebaiknya Anda memodifikasi instans DB Anda untuk menggunakan salah satu kelas instans R DB yang didukung (komputasi skala).
-
Pertahankan jumlah penyisipan per transaksi di bawah 1 juta untuk klaster DB yang memiliki pencatatan log biner.
Jika grup parameter cluster DB untuk cluster DB Anda memiliki
binlog_format
parameter yang disetel ke nilai selainOFF
, maka cluster DB Anda mungkin mengalami out-of-memory kondisi jika cluster DB menerima transaksi yang berisi lebih dari 1 juta baris untuk disisipkan. Anda dapat memantau metrik memori yang dapat dibebaskan (FreeableMemory
) untuk menentukan apakah klaster DB Anda kehabisan memori. Kemudian, Anda memeriksa metrik operasi tulis (VolumeWriteIOPS
) untuk melihat apakah instans penulis menerima beban berat dari operasi tulis. Jika demikian, kami menyarankan agar Anda memperbarui aplikasi Anda untuk membatasi jumlah penyisipan dalam transaksi hingga kurang dari 1 juta. Alternatifnya, Anda dapat memodifikasi instans Anda untuk menggunakan salah satu dari kelas instans DB R yang didukung (penskalaan komputasi).
Mengoptimalkan Aurora Kueri gabungan SQL saya yang diindeks dengan prefetch kunci asinkron
Aurora My SQL dapat menggunakan fitur asynchronous key prefetch (AKP) untuk meningkatkan kinerja kueri yang menggabungkan tabel di seluruh indeks. Fitur ini meningkatkan kinerja dengan mengantisipasi baris yang diperlukan untuk menjalankan kueri di mana JOIN kueri memerlukan penggunaan algoritma Batched Key Access (BKA) Join dan fitur pengoptimalan Multi-Range Read (MRR). Untuk informasi selengkapnya tentang BKA danMRR, lihat Memblokir sambungan akses kunci bersarang dan
Untuk memanfaatkan AKP fitur ini, kueri harus menggunakan keduanya BKA danMRR. Biasanya, kueri seperti itu terjadi ketika JOIN klausa kueri menggunakan indeks sekunder, tetapi juga membutuhkan beberapa kolom dari indeks utama. Misalnya, Anda dapat menggunakan AKP ketika JOIN klausa mewakili ekuijoin pada nilai indeks antara tabel dalam luar kecil dan besar, dan indeks sangat selektif pada tabel yang lebih besar. AKPbekerja bersama dengan BKA dan MRR untuk melakukan pencarian indeks sekunder ke primer selama evaluasi JOIN klausa. AKPmengidentifikasi baris yang diperlukan untuk menjalankan kueri selama evaluasi JOIN klausa. Kemudian, fitur ini menggunakan thread latar belakang untuk secara asinkron memuat halaman yang berisi baris tersebut ke dalam memori sebelum menjalankan kueri.
AKPtersedia untuk Aurora My SQL versi 2.10 dan lebih tinggi, dan versi 3. Untuk informasi lebih lanjut tentang Aurora SQL versi Saya, lihat. Pembaruan mesin database untuk Amazon Aurora My SQL
Mengaktifkan prefetch kunci asinkron
Anda dapat mengaktifkan AKP fitur dengan mengaturaurora_use_key_prefetch
, variabel SQL server Saya, keon
. Secara default, nilai ini diatur ke on
. Namun, tidak AKP dapat diaktifkan sampai Anda juga mengaktifkan algoritma BKA Gabung dan menonaktifkan fungsionalitas berbasis biayaMRR. Untuk melakukannya, Anda harus menetapkan nilai berikut untukoptimizer_switch
, variabel SQL server Saya:
-
Atur
batched_key_access
keon
. Nilai ini mengontrol penggunaan algoritma BKA Join. Secara default, nilai ini diatur keoff
. Atur
mrr_cost_based
keoff
. Nilai ini mengontrol penggunaan fungsionalitas berbasis biayaMRR. Secara default, nilai ini diatur keon
.
Saat ini, Anda dapat mengatur nilai ini hanya di tingkat sesi. Contoh berikut menggambarkan bagaimana mengatur nilai-nilai ini AKP untuk mengaktifkan sesi saat ini dengan mengeksekusi pernyataanSET.
mysql>
set @@session.aurora_use_key_prefetch=on;mysql>
set @@session.optimizer_switch='batched_key_access=on,mrr_cost_based=off';
Demikian pula, Anda dapat menggunakan SET pernyataan untuk menonaktifkan AKP dan algoritma BKA Join dan mengaktifkan kembali MRR fungsionalitas berbasis biaya untuk sesi saat ini, seperti yang ditunjukkan pada contoh berikut.
mysql>
set @@session.aurora_use_key_prefetch=off;mysql>
set @@session.optimizer_switch='batched_key_access=off,mrr_cost_based=on';
Mengoptimalkan kueri untuk prefetch kunci asinkron
Anda dapat mengonfirmasi apakah kueri dapat memanfaatkan AKP fitur tersebut. Untuk melakukannya, gunakan pernyataan EXPLAIN
untuk membuat profil kueri sebelum menjalankannya. Pernyataan EXPLAIN
memberikan informasi tentang rencana eksekusi yang akan digunakan untuk kueri tertentu.
Pada output pernyataan EXPLAIN
, kolom Extra
menjelaskan informasi tambahan, termasuk rencana eksekusi. Jika AKP fitur ini berlaku untuk tabel yang digunakan dalam kueri, kolom ini mencakup salah satu nilai berikut:
Using Key Prefetching
Using join buffer (Batched Key Access with Key Prefetching)
Contoh berikut menunjukkan penggunaan EXPLAIN
untuk melihat rencana eksekusi untuk query yang dapat mengambil keuntungan dariAKP.
mysql>
explain select sql_no_cache->
ps_partkey,->
sum(ps_supplycost * ps_availqty) as value->
from->
partsupp,->
supplier,->
nation->
where->
ps_suppkey = s_suppkey->
and s_nationkey = n_nationkey->
and n_name = 'ETHIOPIA'->
group by->
ps_partkey having->
sum(ps_supplycost * ps_availqty) > (->
select->
sum(ps_supplycost * ps_availqty) * 0.0000003333->
from->
partsupp,->
supplier,->
nation->
where->
ps_suppkey = s_suppkey->
and s_nationkey = n_nationkey->
and n_name = 'ETHIOPIA'->
)->
order by->
value desc;+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ | 1 | PRIMARY | nation | ALL | PRIMARY | NULL | NULL | NULL | 25 | 100.00 | Using where; Using temporary; Using filesort | | 1 | PRIMARY | supplier | ref | PRIMARY,i_s_nationkey | i_s_nationkey | 5 | dbt3_scale_10.nation.n_nationkey | 2057 | 100.00 | Using index | | 1 | PRIMARY | partsupp | ref | i_ps_suppkey | i_ps_suppkey | 4 | dbt3_scale_10.supplier.s_suppkey | 42 | 100.00 | Using join buffer (Batched Key Access with Key Prefetching) | | 2 | SUBQUERY | nation | ALL | PRIMARY | NULL | NULL | NULL | 25 | 100.00 | Using where | | 2 | SUBQUERY | supplier | ref | PRIMARY,i_s_nationkey | i_s_nationkey | 5 | dbt3_scale_10.nation.n_nationkey | 2057 | 100.00 | Using index | | 2 | SUBQUERY | partsupp | ref | i_ps_suppkey | i_ps_suppkey | 4 | dbt3_scale_10.supplier.s_suppkey | 42 | 100.00 | Using join buffer (Batched Key Access with Key Prefetching) | +----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ 6 rows in set, 1 warning (0.00 sec)
Untuk informasi selengkapnya tentang format EXPLAIN
output, lihat Extended EXPLAIN output format
Mengoptimalkan Aurora besar Kueri bergabung SQL saya dengan gabungan hash
Saat Anda harus menggabungkan sejumlah besar data dengan menggunakan equijoin, hash join dapat meningkatkan performa kueri. Anda dapat mengaktifkan gabungan hash untuk Aurora My. SQL
Kolom hash join dapat berupa ekspresi rumit apa pun. Dalam kolom hash join, Anda dapat membandingkan jenis data dengan cara berikut:
-
Anda dapat membandingkan apa pun dalam kategori jenis data numerik yang tepat, seperti
int
,bigint
,numeric
, danbit
. -
Anda dapat membandingkan apa pun dalam kategori perkiraan jenis data numerik, seperti
float
dandouble
. -
Anda dapat membandingkan item di seluruh jenis string jika jenis string memiliki kumpulan karakter dan kolasi yang sama.
-
Anda dapat membandingkan item dengan jenis data tanggal dan stempel waktu jika jenisnya sama.
catatan
Anda tidak dapat membandingkan jenis data dalam kategori yang berbeda.
Pembatasan berikut berlaku untuk bergabung dengan hash untuk Aurora My: SQL
-
Gabungan luar kiri-kanan tidak didukung untuk Aurora My SQL versi 2, tetapi didukung untuk versi 3.
-
Semijoin seperti subkueri tidak didukung, kecuali jika subkueri dimaterialkan terlebih dahulu.
-
Pembaruan atau penghapusan multi-tabel tidak didukung.
catatan
Pembaruan atau penghapusan satu tabel didukung.
-
BLOBdan kolom tipe data spasial tidak dapat bergabung dengan kolom dalam gabungan hash.
Mengaktifkan hash join
Untuk mengaktifkan hash join:
-
Aurora SQL Versi saya 2 - Atur parameter DB atau parameter
aurora_disable_hash_join
cluster DB ke.0
Jikaaurora_disable_hash_join
dinonaktifkan, nilaioptimizer_switch
berubah menjadihash_join=on
. -
Aurora My SQL version 3 — Atur parameter
optimizer_switch
My SQL server ke.block_nested_loop=on
Gabungan hash diaktifkan secara default di Aurora My SQL versi 3 dan dimatikan secara default di Aurora My version 2. SQL Contoh berikut menggambarkan cara mengaktifkan gabungan hash untuk Aurora My versi 3. SQL Anda dapat mengeluarkan pernyataan select @@optimizer_switch
terlebih dahulu untuk melihat apa saja pengaturan lain yang ada dalam string parameter SET
. Memperbarui satu pengaturan dalam parameter optimizer_switch
tidak akan menghapus atau memodifikasi pengaturan lainnya.
mysql>
SET optimizer_switch='block_nested_loop=on';
catatan
Untuk Aurora My SQL versi 3, dukungan bergabung hash tersedia di semua versi minor dan diaktifkan secara default.
Untuk Aurora My SQL versi 2, dukungan bergabung hash tersedia di semua versi minor. Di Aurora My SQL version 2, fitur hash join selalu dikontrol oleh nilainya. aurora_disable_hash_join
Dengan pengaturan ini, pengoptimisasi memilih untuk menggunakan hash join berdasarkan biaya, karakteristik kueri, dan ketersediaan sumber daya. Jika estimasi biaya salah, Anda dapat memaksa pengoptimisasi untuk memilih hash join. Anda melakukannya dengan mengaturhash_join_cost_based
, variabel SQL server Saya, keoff
. Contoh berikut mengilustrasikan cara memaksa pengoptimisasi untuk memilih hash join.
mysql>
SET optimizer_switch='hash_join_cost_based=off';
catatan
Pengaturan ini mengganti keputusan pengoptimisasi berbasis biaya. Meskipun pengaturan ini dapat berguna untuk pengujian dan pengembangan, kami menyarankan Anda untuk tidak menggunakannya dalam produksi.
Mengoptimalkan kueri untuk hash join
Untuk mengetahui apakah kueri dapat memanfaatkan hash join, gunakan pernyataan EXPLAIN
untuk membuat profil kueri terlebih dahulu. Pernyataan EXPLAIN
memberikan informasi tentang rencana eksekusi yang akan digunakan untuk kueri tertentu.
Pada output pernyataan EXPLAIN
, kolom Extra
menjelaskan informasi tambahan, termasuk rencana eksekusi. Jika hash join berlaku pada tabel yang digunakan dalam kueri, kolom ini akan mencakup nilai seperti yang berikut ini:
Using where; Using join buffer (Hash Join Outer table
table1_name
)Using where; Using join buffer (Hash Join Inner table
table2_name
)
Contoh berikut menunjukkan penggunaan EXPLAIN untuk melihat rencana eksekusi untuk query bergabung hash.
mysql>
explain SELECT sql_no_cache * FROM hj_small, hj_big, hj_big2->
WHERE hj_small.col1 = hj_big.col1 and hj_big.col1=hj_big2.col1 ORDER BY 1;+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ | 1 | SIMPLE | hj_small | ALL | NULL | NULL | NULL | NULL | 6 | Using temporary; Using filesort | | 1 | SIMPLE | hj_big | ALL | NULL | NULL | NULL | NULL | 10 | Using where; Using join buffer (Hash Join Outer table hj_big) | | 1 | SIMPLE | hj_big2 | ALL | NULL | NULL | NULL | NULL | 15 | Using where; Using join buffer (Hash Join Inner table hj_big2) | +----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ 3 rows in set (0.04 sec)
Dalam output ini, Hash Join Inner table
adalah tabel yang digunakan untuk membuat tabel hash, dan Hash Join Outer table
adalah tabel yang digunakan untuk menyelidiki tabel hash.
Untuk informasi selengkapnya tentang format EXPLAIN
keluaran yang diperluas, lihat Format EXPLAIN Output Diperpanjang
Di Aurora My SQL 2.08 dan yang lebih tinggi, Anda dapat menggunakan SQL petunjuk untuk memengaruhi apakah kueri menggunakan gabungan hash atau tidak, dan tabel mana yang akan digunakan untuk sisi build dan probe gabungan. Untuk detailnya, lihat Aurora Petunjuk saya SQL.
Menggunakan Amazon Aurora untuk menskalakan bacaan untuk database Saya SQL
Anda dapat menggunakan Amazon Aurora dengan instans My SQL DB Anda untuk memanfaatkan kemampuan penskalaan baca Amazon Aurora dan memperluas beban kerja baca untuk instans DB Saya. SQL Untuk menggunakan Aurora untuk membaca skala instans My SQL DB Anda, buat cluster Aurora My SQL DB dan jadikan replika baca instans My DB Anda. SQL Kemudian sambungkan ke SQL cluster Aurora My untuk memproses kueri baca. Database sumber dapat berupa RDS instans SQL DB Saya, atau SQL database Saya yang berjalan di luar AmazonRDS. Untuk informasi selengkapnya, lihat Penskalaan bacaan untuk SQL database Saya dengan Amazon Aurora.
Mengoptimalkan operasi stempel waktu
Ketika nilai variabel sistem time_zone
diatur keSYSTEM
, setiap panggilan SQL fungsi Saya yang memerlukan perhitungan zona waktu membuat panggilan perpustakaan sistem. Saat Anda menjalankan SQL pernyataan yang mengembalikan atau mengubah TIMESTAMP
nilai tersebut pada konkurensi tinggi, Anda mungkin mengalami peningkatan latensi, pertentangan kunci, dan penggunaan. CPU Untuk informasi selengkapnya, lihat time_zone
Untuk menghindari perilaku ini, sebaiknya Anda mengubah nilai parameter klaster DB time_zone
menjadi UTC
. Untuk informasi selengkapnya, lihat Memodifikasi parameter dalam grup parameter cluster DB di Amazon Aurora.
Meskipun parameter time_zone
bersifat dinamis (tidak memerlukan pengaktifan ulang server basis data), nilai baru hanya digunakan untuk koneksi baru. Untuk memastikan bahwa semua koneksi diperbarui untuk menggunakan nilai time_zone
baru, kami sarankan Anda mendaur ulang koneksi aplikasi Anda setelah memperbarui parameter klaster DB.