Untuk pernyataan 6, 7, dan 8, satu pernyataan multi-baris lebih cepat daripada beberapa pernyataan satu baris. Jika memungkinkan, gunakan pernyataan multi-baris untuk kueri DML alih-alih beberapa pernyataan baris tunggal Show
Untuk informasi lebih lanjut, lihat
Gunakan username | post_timestamp | post_id | post_content +----------+---------------------------+---------+--------------+ alyssa | 2019-07-31 18:01:00+00:00 | .. | ... alyssa | 2019-07-30 10:22:00+00:00 | .. | ... alyssa | 2019-07-30 09:12:00+00:00 | .. | ... alyssa | 2019-07-29 13:48:00+00:00 | .. | ... alyssa | 2019-07-29 13:47:00+00:00 | .. | ... alyssa | 2019-07-29 13:46:00+00:00 | .. | ... alyssa | 2019-07-29 13:43:00+00:00 | .. | ... ... Time: 924µs 7 alih-alih > EXPLAIN (VERBOSE) SELECT * FROM posts WHERE username = 'alyssa' ORDER BY post_timestamp DESC LIMIT 10; 0 pada tabel tanpa indeks sekunderSaat memasukkan/memperbarui semua kolom tabel, dan tabel tidak memiliki indeks sekunder, Cockroach Labs merekomendasikan penggunaan pernyataan 7 alih-alih pernyataan 0 yang setara. Sedangkan _0 selalu melakukan pembacaan untuk menentukan penulisan yang diperlukan, pernyataan 7 menulis tanpa membaca, membuatnya lebih cepat. Untuk tabel dengan indeks sekunder, tidak ada perbedaan kinerja antara 7 dan 0Masalah ini sangat relevan saat menggunakan tabel SQL sederhana dengan dua kolom. Dalam hal ini, pastikan untuk menggunakan pernyataan 7Praktik terbaik penyisipan massalGunakan pernyataan username | post_timestamp | post_id | post_content +----------+---------------------------+---------+--------------+ alyssa | 2019-07-31 18:01:00+00:00 | .. | ... alyssa | 2019-07-30 10:22:00+00:00 | .. | ... alyssa | 2019-07-30 09:12:00+00:00 | .. | ... alyssa | 2019-07-29 13:48:00+00:00 | .. | ... alyssa | 2019-07-29 13:47:00+00:00 | .. | ... alyssa | 2019-07-29 13:46:00+00:00 | .. | ... alyssa | 2019-07-29 13:43:00+00:00 | .. | ... ... Time: 924µs 6 multi-baris untuk penyisipan massal ke dalam tabel yang adaUntuk menyisipkan data secara massal ke dalam tabel yang ada, kelompokkan beberapa baris dalam satu pernyataan 6 multi-baris. Secara eksperimental tentukan ukuran batch yang optimal untuk aplikasi Anda dengan memantau performa untuk ukuran batch yang berbeda (10 baris, 100 baris, 1000 baris). Jangan sertakan pernyataan 6 massal dalam transaksi eksplisitTip Anda juga dapat menggunakan pernyataan 1 untuk menyisipkan data CSV secara massal ke dalam tabel yang sudah adaUntuk informasi lebih lanjut, lihat Catatan Kueri 6 multi-baris yang besar dapat menyebabkan transaksi berjalan lama yang mengakibatkan kesalahan coba lagi transaksi. Jika kueri 6 multi-baris menghasilkan kode kesalahan , sebaiknya pisahkan kueri menjadi kumpulan baris yang lebih kecilGunakan info ---------------------------------------------------------------- distribution: local vectorized: true • revscan columns: (username, post_timestamp, post_id, post_content) ordering: -post_timestamp estimated row count: 10 (missing stats) table: posts@posts_pk spans: /"alyssa"-/"alyssa"/PrefixEnd limit: 10 (10 rows) Time: 1ms total (execution 1ms / network 0ms) _6 alih-alih username | post_timestamp | post_id | post_content +----------+---------------------------+---------+--------------+ alyssa | 2019-07-31 18:01:00+00:00 | .. | ... alyssa | 2019-07-30 10:22:00+00:00 | .. | ... alyssa | 2019-07-30 09:12:00+00:00 | .. | ... alyssa | 2019-07-29 13:48:00+00:00 | .. | ... alyssa | 2019-07-29 13:47:00+00:00 | .. | ... alyssa | 2019-07-29 13:46:00+00:00 | .. | ... alyssa | 2019-07-29 13:43:00+00:00 | .. | ... ... Time: 924µs 6 untuk penyisipan massal ke tabel baruUntuk menyisipkan data secara massal ke tabel baru, pernyataan 6 berperforma lebih baik daripada 6Praktik terbaik hapus massalGunakan > CREATE TABLE users ( id UUID NOT NULL DEFAULT gen_random_uuid(), city STRING NOT NULL, name STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC), FAMILY "primary" (id, city, name, address, credit_card) ); 0 alih-alih username | post_timestamp | post_id | post_content +----------+---------------------------+---------+--------------+ alyssa | 2019-07-31 18:01:00+00:00 | .. | ... alyssa | 2019-07-30 10:22:00+00:00 | .. | ... alyssa | 2019-07-30 09:12:00+00:00 | .. | ... alyssa | 2019-07-29 13:48:00+00:00 | .. | ... alyssa | 2019-07-29 13:47:00+00:00 | .. | ... alyssa | 2019-07-29 13:46:00+00:00 | .. | ... alyssa | 2019-07-29 13:43:00+00:00 | .. | ... ... Time: 924µs 8 untuk menghapus semua baris dalam tabelPernyataan _0 menghapus semua baris dari tabel dengan menghapus tabel dan membuat ulang tabel baru dengan nama yang sama. Ini bekerja lebih baik daripada menggunakan _8, yang melakukan banyak transaksi untuk menghapus semua barisGunakan penghapusan batch untuk menghapus sejumlah besar barisUntuk menghapus baris dalam jumlah besar, sebaiknya hapus kumpulan baris secara iteratif hingga semua baris yang tidak diinginkan terhapus. Sebagai contoh, lihat Hapus Data Massal Batch menghapus data "kedaluwarsa".CockroachDB memiliki dukungan untuk Time to Live ("TTL") kedaluwarsa pada baris tabel, juga dikenal sebagai TTL Tingkat Baris. TTL Tingkat Baris adalah mekanisme di mana baris dari tabel dianggap "kedaluwarsa" dan dapat dihapus secara otomatis setelah baris tersebut disimpan lebih lama dari waktu kedaluwarsa yang ditentukan Untuk informasi lebih lanjut, lihat Batch menghapus data kedaluwarsa dengan Row-Level TTL Tetapkan keluarga kolomKeluarga kolom adalah grup kolom dalam tabel yang disimpan sebagai pasangan nilai kunci tunggal di penyimpanan nilai kunci yang mendasarinya Saat tabel dibuat, semua kolom disimpan sebagai satu keluarga kolom. Pendekatan default ini memastikan penyimpanan dan kinerja nilai kunci yang efisien dalam banyak kasus. Namun, ketika kolom yang sering diperbarui dikelompokkan dengan kolom yang jarang diperbarui, kolom yang jarang diperbarui tetap ditulis ulang pada setiap pembaruan. Terutama ketika kolom yang jarang diperbarui berukuran besar, oleh karena itu akan lebih baik untuk menetapkannya ke kelompok kolom yang berbeda Praktik terbaik ID unikPraktik terbaik untuk membuat ID unik dalam database terdistribusi seperti CockroachDB sangat berbeda dengan database node tunggal lama. Pendekatan tradisional untuk menghasilkan ID unik untuk basis data node tunggal lama termasuk
Pendekatan yang dijelaskan di atas cenderung membuat hot spot untuk membaca dan menulis di CockroachDB. Untuk menghindari masalah ini, kami merekomendasikan pendekatan berikut (tercantum dalam urutan dari kinerja terbaik hingga terburuk) ApproachProsCons1. Berpotensi tercepat, jika dilakukan dengan benarKompleks, memerlukan desain dan pengujian awal untuk memastikan kinerja2. Penampilan yang bagus; . Mudah untuk ditanyakan;Gunakan kunci utama multi-kolomKunci utama multi-kolom yang dirancang dengan baik dapat menghasilkan kinerja yang lebih baik daripada a , tetapi membutuhkan pekerjaan desain skema yang lebih awal. Untuk mendapatkan kinerja terbaik, pastikan setiap bidang yang meningkat secara monoton ditempatkan setelah kolom pertama kunci utama. Ketika dilakukan dengan benar, kunci utama komposit seperti itu akan menghasilkan
Misalnya, pertimbangkan situs web media sosial. Postingan media sosial ditulis oleh pengguna, dan saat login, 10 postingan terakhir pengguna ditampilkan. Pilihan yang baik untuk kunci utama adalah 2. Sebagai contohikon/tombol/salin
Ini akan membuat kueri berikut menjadi efisien ikon/tombol/salin
Untuk mengetahui alasannya, mari kita lihat keluaran 3. Ini menunjukkan bahwa kueri cepat karena melakukan pencarian titik pada kolom yang diindeks 4 (seperti yang ditunjukkan oleh baris 5). Selain itu, kolom _6 sudah ada dalam indeks, dan diurutkan (karena ini merupakan bagian kunci utama yang meningkat secara monoton)ikon/tombol/salin _
Perhatikan bahwa kueri di atas juga mengikuti pengindeksan semua kolom dalam klausa 7Gunakan > CREATE TABLE users ( id UUID NOT NULL DEFAULT gen_random_uuid(), city STRING NOT NULL, name STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC), FAMILY "primary" (id, city, name, address, credit_card) ); _9 untuk menghasilkan ID unikUntuk membuat pengidentifikasi baris unik secara otomatis, gunakan kolom 9 dengan 0 sebagai nilai defaultikon/tombol/salin
ikon/tombol/salin
ikon/tombol/salin
Alternatifnya, Anda dapat menggunakan kolom _1 dengan fungsi 2 sebagai nilai defaultikon/tombol/salin
ikon/tombol/salin 0ikon/tombol/salin
_2Dalam kedua kasus tersebut, ID yang dihasilkan akan berukuran 128-bit, cukup besar sehingga hampir tidak ada peluang untuk menghasilkan nilai yang tidak unik. Selain itu, setelah tabel berkembang melampaui rentang nilai kunci tunggal (lebih dari 512 MiB secara default), ID baru akan tersebar di semua rentang tabel dan, oleh karena itu, mungkin di berbagai node yang berbeda. Ini berarti bahwa banyak node akan berbagi beban Pendekatan ini memiliki kelemahan dalam membuat kunci primer yang mungkin tidak berguna dalam kueri secara langsung, yang dapat memerlukan penggabungan dengan tabel lain atau indeks sekunder. Jika ID yang dihasilkan penting untuk disimpan dalam rentang nilai kunci yang sama, Anda dapat menggunakan tipe integer dengan 3 sebagai nilai default, baik secara eksplisit atau melalui tipe semu 4ikon/tombol/salin _3ikon/tombol/salin _4ikon/tombol/salin _5 _6Setelah insert atau upsert, fungsi _3 menghasilkan nilai default dari timestamp dan ID node yang mengeksekusi insert. Nilai urutan waktu seperti itu cenderung unik secara global kecuali dalam kasus di mana sejumlah besar ID (100.000+) dihasilkan per node per detik. Selain itu, mungkin ada celah dan urutannya tidak sepenuhnya dijaminUntuk latar belakang lebih lanjut tentang UUID, lihat Apa itu UUID, dan Mengapa Anda Harus Peduli? Gunakan username | post_timestamp | post_id | post_content +----------+---------------------------+---------+--------------+ alyssa | 2019-07-31 18:01:00+00:00 | .. | ... alyssa | 2019-07-30 10:22:00+00:00 | .. | ... alyssa | 2019-07-30 09:12:00+00:00 | .. | ... alyssa | 2019-07-29 13:48:00+00:00 | .. | ... alyssa | 2019-07-29 13:47:00+00:00 | .. | ... alyssa | 2019-07-29 13:46:00+00:00 | .. | ... alyssa | 2019-07-29 13:43:00+00:00 | .. | ... ... Time: 924µs 6 dengan klausa > INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle'); 1 untuk menghasilkan ID unikJika ada sesuatu yang menghalangi Anda untuk menggunakan atau membuat ID unik, Anda dapat menggunakan 6 dengan 6 untuk mengembalikan ID. Sebaliknya, seperti yang ditunjukkan di bawah ini untuk peningkatan kinerjaHasilkan ID unik yang meningkat secara monotonMisalkan skema tabelnya adalah sebagai berikut ikon/tombol/salin _7Pendekatan yang umum adalah menggunakan transaksi dengan 6 diikuti dengan 6ikon/tombol/salin _8Namun, praktik terbaik kinerja adalah menggunakan klausa _1 dengan 6 sebagai ganti transaksiikon/tombol/salin _9Hasilkan ID unik acakMisalkan skema tabelnya adalah sebagai berikut ikon/tombol/salin 0Pendekatan umum untuk menghasilkan ID Unik acak adalah transaksi menggunakan pernyataan 6ikon/tombol/salin _1Namun, praktik terbaik kinerja adalah menggunakan klausa _1 dengan 6 sebagai ganti transaksiikon/tombol/salin _2Praktik terbaik indeks sekunderLihat Bergabunglah dengan praktik terbaikLihat Praktik terbaik subkueriLihat Praktik terbaik otorisasiLihat Praktik terbaik pemindaian tabelHindari > CREATE TABLE users2 ( id BYTES DEFAULT uuid_v4(), city STRING NOT NULL, name STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC), FAMILY "primary" (id, city, name, address, credit_card) ); _0 untuk meja besarUntuk tabel besar, hindari pemindaian tabel (yaitu, membaca seluruh data tabel) jika memungkinkan. Sebagai gantinya, tentukan bidang yang wajib diisi dalam pernyataan 6ContohMisalkan skema tabelnya adalah sebagai berikut ikon/tombol/salin _3Sekarang jika kita ingin menemukan saldo akun semua pelanggan, pemindaian tabel tidak efisien ikon/tombol/salin _4Kueri ini mengambil semua data yang disimpan dalam tabel. Kueri yang lebih efisien adalah ikon/tombol/salin 5Kueri ini mengembalikan saldo akun pelanggan Hindari > CREATE TABLE users2 ( id BYTES DEFAULT uuid_v4(), city STRING NOT NULL, name STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC), FAMILY "primary" (id, city, name, address, credit_card) ); _2 untuk meja besar 2 memungkinkan Anda mendapatkan entri unik dari kueri dengan menghapus entri duplikat. Namun, _2 mahal secara komputasi. Sebagai praktik terbaik kinerja, gunakan sebagai gantinyaGunakan > CREATE TABLE users2 ( id BYTES DEFAULT uuid_v4(), city STRING NOT NULL, name STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC), FAMILY "primary" (id, city, name, address, credit_card) ); _7 untuk mengurangi konflik dengan kueri yang berjalan lamaJika Anda memiliki kueri yang berjalan lama (seperti kueri analitik yang melakukan pemindaian tabel lengkap) yang dapat mentolerir pembacaan yang sedikit kedaluwarsa, pertimbangkan untuk menggunakan. Dengan menggunakan ini, kueri Anda mengembalikan data seperti yang muncul pada titik berbeda di masa lalu dan tidak akan menyebabkan transaksi bersamaan lainnya, yang dapat meningkatkan kinerja aplikasi Anda Namun, karena _7 menampilkan data historis, pembacaan Anda mungkin sudah basiTitik panasHot spot adalah lokasi mana pun di kluster yang menerima lebih banyak permintaan secara signifikan daripada yang lain. Hot spot dapat menyebabkan masalah saat permintaan meningkat Biasanya terjadi dengan transaksi yang beroperasi pada rentang yang sama tetapi kunci indeks yang berbeda, yang dibatasi oleh keseluruhan kapasitas perangkat keras node Titik panas dapat terjadi pada rentang yang diindeks pada kolom data yang bersifat berurutan (mis. g. , , atau serangkaian 00s yang meningkat dan tidak berulang), sehingga semua penulisan yang masuk ke rentang akan menjadi item terakhir (atau pertama) dalam indeks dan ditambahkan ke akhir rentang. Karena sistem tidak dapat menemukan titik pisah dalam rentang yang membagi lalu lintas secara merata, rentang tersebut tidak dapat memanfaatkan pemisahan berbasis beban. Ini menciptakan hot spot pada rentang tunggalHot spot baca dapat terjadi jika Anda melakukan banyak pemindaian pada sebagian indeks tabel atau satu kunci Temukan hot spotUntuk melacak node yang mengalami hot spot, gunakan halaman Hot Ranges dan Kurangi hot spotUntuk mengurangi titik panas
Perselisihan transaksiTransaksi yang beroperasi pada nilai kunci indeks yang sama (khususnya, yang beroperasi pada keluarga kolom yang sama untuk kunci indeks yang diberikan) secara ketat diserialisasi untuk mematuhi semantik isolasi transaksi. Untuk menjaga isolasi ini, tulis transaksi "kunci" baris untuk mencegah interaksi berbahaya dengan transaksi bersamaan. Namun, penguncian dapat menyebabkan penundaan pemrosesan jika beberapa transaksi mencoba mengakses data "terkunci" yang sama pada saat yang bersamaan. Ini disebut sebagai pertentangan transaksi (atau penguncian). Perselisihan transaksi terjadi ketika tiga kondisi berikut terpenuhi
Transaksi yang mengalami pertentangan biasanya menunjukkan penundaan penyelesaian atau memulai kembali. Kemungkinan restart transaksi mengharuskan klien untuk mengimplementasikan Untuk latar belakang lebih lanjut tentang sanggahan transaksi, lihat Apa itu Sanggahan Basis Data, dan Mengapa Anda Harus Peduli? Temukan sanggahan transaksiTemukan transaksi dan pernyataan dalam transaksi yang mengalami pertengkaran. CockroachDB memiliki beberapa alat untuk membantu Anda melacak transaksi dan pernyataan tersebut
Setelah Anda mengidentifikasi transaksi atau laporan yang menyebabkan pertengkaran, ikuti langkah-langkah di bagian berikutnya Catatan Jika Anda mengalami kueri macet atau macet yang tidak muncul dalam daftar transaksi dan pernyataan yang diperdebatkan pada halaman Transaksi atau Pernyataan di Konsol DB, proses yang dijelaskan di atas tidak akan berfungsi. Anda harus mengikuti proses yang dijelaskan sebagai gantinya Kurangi pertentangan transaksiUntuk mengurangi pertentangan transaksi
Tingkatkan kinerja transaksi dengan mengukur dan mengonfigurasi clusterUntuk memaksimalkan performa transaksi, Anda harus memaksimalkan performa satu rentang. Untuk mencapai ini, Anda dapat menerapkan beberapa strategi Apakah jumlah kolom memengaruhi kinerja kueri?Ya, sedikit , tanpa indeks sama sekali, kedua kueri (Tabel A dan Tabel B) akan melakukan pemindaian tabel. Mengingat bahwa Tabel B memiliki lebih sedikit kolom daripada Tabel A , baris per halaman (kepadatan) akan lebih tinggi pada B sehingga B akan sedikit lebih cepat karena lebih sedikit halaman yang perlu diambil.
Berapa banyak kolom yang terlalu banyak MySQL?MySQL memiliki batas keras 4096 kolom per tabel , tetapi maksimum efektif mungkin kurang untuk tabel tertentu. Batas kolom yang tepat bergantung pada beberapa faktor. Ukuran baris maksimum untuk tabel membatasi jumlah (dan kemungkinan ukuran) kolom karena panjang total semua kolom tidak dapat melebihi ukuran ini.
Akankah jumlah kolom dalam tabel dapat memengaruhi kinerja di SQL Server?Jawab. Ya, ukuran baris (dba_tables. avg_row_len) dan ukuran blok data memengaruhi kecepatan pengambilan SQL , dan ini sangat penting untuk gudang data dan tabel "fakta" sistem pendukung keputusan, yang .
Apakah jumlah kolom dalam tabel memengaruhi kinerja kueri dalam tabel tersebut di MySQL jika demikian, bagaimana caranya?Ya, jumlah kolom akan - secara tidak langsung - memengaruhi performa . Data dalam kolom juga akan mempengaruhi kecepatan. |