Apakah jumlah kolom memengaruhi kinerja di mysql?

Untuk 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,
  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, dan
  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, 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

  • Sisipkan Data
  • Perbaharui data
  • Hapus Data
  • Cara meningkatkan kinerja aplikasi IoT dengan DML multi-baris

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 sekunder

Saat memasukkan/memperbarui semua kolom tabel, dan tabel tidak memiliki indeks sekunder, Cockroach Labs merekomendasikan penggunaan 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
7 alih-alih pernyataan
> EXPLAIN (VERBOSE)
    SELECT * FROM posts
            WHERE username = 'alyssa'
         ORDER BY post_timestamp DESC
            LIMIT 10;
0 yang setara. Sedangkan
> EXPLAIN (VERBOSE)
    SELECT * FROM posts
            WHERE username = 'alyssa'
         ORDER BY post_timestamp DESC
            LIMIT 10;
_0 selalu melakukan pembacaan untuk menentukan penulisan yang diperlukan, 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
7 menulis tanpa membaca, membuatnya lebih cepat. Untuk tabel dengan indeks sekunder, tidak ada perbedaan kinerja antara
  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 dan
> EXPLAIN (VERBOSE)
    SELECT * FROM posts
            WHERE username = 'alyssa'
         ORDER BY post_timestamp DESC
            LIMIT 10;
0

Masalah ini sangat relevan saat menggunakan tabel SQL sederhana dengan dua kolom. Dalam hal ini, pastikan untuk menggunakan 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
7

Praktik terbaik penyisipan massal

Gunakan 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 ada

Untuk menyisipkan data secara massal ke dalam tabel yang ada, kelompokkan beberapa baris dalam satu 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. 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
  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 massal dalam transaksi eksplisit

Tip

Anda juga dapat menggunakan pernyataan

                              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)
1 untuk menyisipkan data CSV secara massal ke dalam tabel yang sudah ada

Untuk informasi lebih lanjut, lihat

Catatan

Kueri

  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 yang besar dapat menyebabkan transaksi berjalan lama yang mengakibatkan kesalahan coba lagi transaksi. Jika kueri
  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 menghasilkan kode kesalahan , sebaiknya pisahkan kueri menjadi kumpulan baris yang lebih kecil

Gunakan 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 baru

Untuk menyisipkan data secara massal ke tabel baru, pernyataan

                              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 berperforma lebih baik daripada
  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

Praktik terbaik hapus massal

Gunakan > 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 tabel

Pernyataan

> 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 menghapus semua baris dari tabel dengan menghapus tabel dan membuat ulang tabel baru dengan nama yang sama. Ini bekerja lebih baik daripada menggunakan
  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, yang melakukan banyak transaksi untuk menghapus semua baris

Gunakan penghapusan batch untuk menghapus sejumlah besar baris

Untuk 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 kolom

Keluarga 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 unik

Praktik 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

  1. Menggunakan tipe pseudo
    > 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)
    );
    
    _4 untuk kolom untuk menghasilkan ID unik acak. Hal ini dapat mengakibatkan kemacetan kinerja karena ID yang dihasilkan sementara berdekatan satu sama lain memiliki nilai yang sama dan terletak secara fisik berdekatan satu sama lain dalam penyimpanan tabel.
  2. Menghasilkan
    > 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)
    );
    
    5 ID yang meningkat secara monoton dengan menggunakan transaksi bolak-balik
    > 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)
    );
    
    6s, e. g. ,
    > 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)
    );
    
    _7. Ini memiliki biaya kinerja yang sangat tinggi karena membuat semua
      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 transaksi menunggu giliran mereka untuk memasukkan ID berikutnya. Anda hanya boleh melakukan ini jika aplikasi Anda benar-benar memerlukan pengurutan ID yang ketat. Dalam beberapa kasus, menggunakan Change Data Capture (CDC) dapat membantu menghindari persyaratan pemesanan ID yang ketat. Jika Anda dapat menghindari persyaratan pengurutan ID yang ketat, Anda dapat menggunakan salah satu strategi ID performa lebih tinggi yang diuraikan di bawah ini

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-kolom

Kunci 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

  • Keacakan yang cukup dalam kunci utama Anda untuk menyebarkan data tabel/memuat kueri secara relatif merata di seluruh kluster, yang akan menghindari hot spot. Yang kami maksud dengan "keacakan yang cukup" adalah bahwa awalan kunci utama harus didistribusikan secara relatif seragam di seluruh domainnya. Domainnya harus memiliki setidaknya elemen sebanyak Anda memiliki node
  • Kolom yang meningkat secara monoton yang merupakan bagian dari kunci utama (dan dengan demikian diindeks) yang juga berguna dalam kueri Anda

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

> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
2. Sebagai contoh

ikon/tombol/salin

> CREATE TABLE posts (
    username STRING,
    post_timestamp TIMESTAMP,
    post_id INT,
    post_content STRING,
    CONSTRAINT posts_pk PRIMARY KEY(username, post_timestamp)
);

Ini akan membuat kueri berikut menjadi efisien

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;

  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

Untuk mengetahui alasannya, mari kita lihat keluaran

> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
3. Ini menunjukkan bahwa kueri cepat karena melakukan pencarian titik pada kolom yang diindeks
> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
4 (seperti yang ditunjukkan oleh baris
> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
5). Selain itu, kolom
> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
_6 sudah ada dalam indeks, dan diurutkan (karena ini merupakan bagian kunci utama yang meningkat secara monoton)

ikon/tombol/salin

> EXPLAIN (VERBOSE)
    SELECT * FROM posts
            WHERE username = 'alyssa'
         ORDER BY post_timestamp DESC
            LIMIT 10;
_

                              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)

Perhatikan bahwa kueri di atas juga mengikuti pengindeksan semua kolom dalam klausa

> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
7

Gunakan > 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 unik

Untuk membuat pengidentifikasi baris unik secara otomatis, gunakan kolom

> 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 dengan
> SELECT * FROM users;
0 sebagai nilai default

ikon/tombol/salin

> 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)
);

ikon/tombol/salin

> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');

ikon/tombol/salin

> SELECT * FROM users;

                   id                  |   city   | name  | address | credit_card
+--------------------------------------+----------+-------+---------+-------------+
  cf8ee4e2-cd74-449a-b6e6-a0fb2017baa4 | new york | Petee | NULL    | NULL
  2382564e-702f-42d9-a139-b6df535ae00a | seattle  | Eric  | NULL    | NULL
  7d27e40b-263a-4891-b29b-d59135e55650 | seattle  | Dan   | NULL    | NULL
(3 rows)

Alternatifnya, Anda dapat menggunakan kolom

> SELECT * FROM users;
_1 dengan fungsi
> SELECT * FROM users;
2 sebagai nilai default

ikon/tombol/salin

> 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)
);

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
0

ikon/tombol/salin

> SELECT * FROM users;

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_2

Dalam 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

> SELECT * FROM users;
3 sebagai nilai default, baik secara eksplisit atau melalui tipe semu
> 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)
);
4

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_3

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_4

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_5

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_6

Setelah insert atau upsert, fungsi

> SELECT * FROM users;
_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 dijamin

Untuk 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 unik

Jika ada sesuatu yang menghalangi Anda untuk menggunakan atau membuat ID unik, Anda dapat menggunakan

  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
> 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)
);
6 untuk mengembalikan ID. Sebaliknya, seperti yang ditunjukkan di bawah ini untuk peningkatan kinerja

Hasilkan ID unik yang meningkat secara monoton

Misalkan skema tabelnya adalah sebagai berikut

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_7

Pendekatan yang umum adalah menggunakan transaksi dengan

  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 diikuti dengan
> 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)
);
6

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_8

Namun, praktik terbaik kinerja adalah menggunakan klausa

> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
_1 dengan
  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 sebagai ganti transaksi

ikon/tombol/salin

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
_9

Hasilkan ID unik acak

Misalkan skema tabelnya adalah sebagai berikut

ikon/tombol/salin

  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
0

Pendekatan umum untuk menghasilkan ID Unik acak adalah transaksi menggunakan pernyataan

> 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)
);
6

ikon/tombol/salin

  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
_1

Namun, praktik terbaik kinerja adalah menggunakan klausa

> INSERT INTO users (name, city) VALUES ('Petee', 'new york'), ('Eric', 'seattle'), ('Dan', 'seattle');
_1 dengan
  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 sebagai ganti transaksi

ikon/tombol/salin

  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
_2

Praktik terbaik indeks sekunder

Lihat

Bergabunglah dengan praktik terbaik

Lihat

Praktik terbaik subkueri

Lihat

Praktik terbaik otorisasi

Lihat

Praktik terbaik pemindaian tabel

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) ); _0 untuk meja besar

Untuk tabel besar, hindari pemindaian tabel (yaitu, membaca seluruh data tabel) jika memungkinkan. Sebagai gantinya, tentukan bidang yang wajib diisi dalam pernyataan

> 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)
);
6

Contoh

Misalkan skema tabelnya adalah sebagai berikut

ikon/tombol/salin

  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
_3

Sekarang jika kita ingin menemukan saldo akun semua pelanggan, pemindaian tabel tidak efisien

ikon/tombol/salin

  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
_4

Kueri ini mengambil semua data yang disimpan dalam tabel. Kueri yang lebih efisien adalah

ikon/tombol/salin

  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
5

Kueri 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

> 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 memungkinkan Anda mendapatkan entri unik dari kueri dengan menghapus entri duplikat. Namun,
> 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 mahal secara komputasi. Sebagai praktik terbaik kinerja, gunakan sebagai gantinya

Gunakan > 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 lama

Jika 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

> 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 menampilkan data historis, pembacaan Anda mungkin sudah basi

Titik panas

Hot 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

> SELECT * FROM posts
          WHERE username = 'alyssa'
       ORDER BY post_timestamp DESC
          LIMIT 10;
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 tunggal

Hot spot baca dapat terjadi jika Anda melakukan banyak pemindaian pada sebagian indeks tabel atau satu kunci

Temukan hot spot

Untuk melacak node yang mengalami hot spot, gunakan halaman Hot Ranges dan

Kurangi hot spot

Untuk mengurangi titik panas

  • Gunakan kunci indeks dengan distribusi nilai acak, sehingga transaksi pada baris yang berbeda lebih cenderung beroperasi pada rentang data yang terpisah. Lihat ID baris untuk saran

  • Tempatkan bagian catatan yang dimodifikasi oleh transaksi berbeda di tabel berbeda. Artinya, tingkatkan normalisasi. Namun, ada keuntungan dan kerugian untuk meningkatkan normalisasi

    • Manfaat

      • Mengizinkan transaksi terpisah untuk memodifikasi data pokok terkait tanpa menyebabkan pertentangan
      • Dapat meningkatkan performa untuk beban kerja berat baca
    • Kekurangan

      • Model data yang lebih kompleks
      • Meningkatkan kemungkinan inkonsistensi data
      • Meningkatkan redundansi data
      • Dapat menurunkan kinerja untuk beban kerja yang berat
  • Jika aplikasi benar-benar mengharuskan pengoperasian pada sangat sedikit kunci indeks yang berbeda, pertimbangkan untuk menggunakan

    > SELECT * FROM posts
              WHERE username = 'alyssa'
           ORDER BY post_timestamp DESC
              LIMIT 10;
    
    01 sehingga setiap kunci indeks dapat dilayani oleh grup node yang terpisah dalam kluster

  • Jika Anda bekerja dengan tabel yang harus diindeks pada kunci berurutan, pertimbangkan untuk menggunakan indeks hash-sharded. Untuk perincian tentang mekanika dan peningkatan kinerja indeks hash-sharded di CockroachDB, lihat entri blog Indeks Hash Sharded Buka Penskalaan Linier untuk Beban Kerja Berurutan. Sebagai bagian dari ini, sebaiknya lakukan pengujian kinerja menyeluruh dengan dan tanpa indeks hash-sharded untuk melihat mana yang paling sesuai untuk aplikasi Anda

  • Untuk menghindari membaca hot spot

    • Tingkatkan distribusi data, yang akan memungkinkan lebih banyak rentang. Hot spot ada karena data yang diakses semuanya ditempatkan bersama dalam satu rentang
    • Tingkatkan penyeimbangan muatan di lebih banyak node dalam rentang yang sama. Sebagian besar pembacaan transaksional harus ditujukan kepada pemegang sewa di CockroachDB, yang berarti bahwa peluang untuk penyeimbangan muatan melalui replika sangat minim

      Namun, fitur berikut mengizinkan penyeimbangan beban pada replika

      • tabel global
      • Pengikut membaca (baik kebosanan terbatas dan jenis kebosanan yang tepat)

      Dalam kasus ini, lebih banyak replika akan membantu, hingga jumlah node dalam kluster. Mereka semua hanya membantu membaca, dan mereka semua datang dengan pengorbanannya sendiri

Perselisihan transaksi

Transaksi 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

  • Ada beberapa transaksi atau pernyataan bersamaan (dikirim oleh banyak klien yang terhubung secara bersamaan ke satu cluster CockroachDB)
  • Mereka beroperasi pada baris tabel dengan nilai kunci indeks yang sama (baik pada kunci primer atau indeks sekunder)
  • Setidaknya satu transaksi mengubah data

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 transaksi

Temukan transaksi dan pernyataan dalam transaksi yang mengalami pertengkaran. CockroachDB memiliki beberapa alat untuk membantu Anda melacak transaksi dan pernyataan tersebut

  • Di Konsol DB
    • Kunjungi tampilan Eksekusi Transaksi di halaman Insight dan cari eksekusi transaksi dengan insight High Contention
    • Kunjungi halaman Transaksi dan Laporan dan urutkan transaksi dan laporan berdasarkan Contention Time
  • Buat kueri dan tabel untuk database Anda untuk menemukan indeks dan tabel yang mengalami pertentangan. Untuk mengetahui transaksi mana yang menahan kunci pada objek mana, kueri

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 transaksi

Untuk mengurangi pertentangan transaksi

  • Buat transaksi lebih kecil, sehingga setiap transaksi memiliki pekerjaan yang lebih sedikit. Secara khusus, hindari beberapa pertukaran klien-server per transaksi. Misalnya, gunakan ekspresi tabel umum untuk mengelompokkan beberapa klausa

    > 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)
    );
    
    6 dan
      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,
    > SELECT * FROM posts
              WHERE username = 'alyssa'
           ORDER BY post_timestamp DESC
              LIMIT 10;
    
    07,
      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, dan
      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 bersama-sama dalam satu pernyataan SQL

    • Untuk contoh yang menunjukkan cara memecah transaksi besar dalam aplikasi, lihat
    • Jika Anda mengalami sanggahan (coba lagi) saat melakukan penghapusan massal, lihat Hapus data massal
  • sehingga CockroachDB dapat mencoba kembali transaksi secara otomatis untuk Anda

  • Gunakan pernyataan

    > SELECT * FROM posts
              WHERE username = 'alyssa'
           ORDER BY post_timestamp DESC
              LIMIT 10;
    
    10 dalam skenario di mana transaksi melakukan pembacaan dan kemudian memperbarui baris yang baru saja dibaca. Pernyataan memerintahkan transaksi dengan mengontrol akses bersamaan ke satu atau lebih baris tabel. Ini bekerja dengan mengunci baris yang dikembalikan oleh kueri pemilihan, sehingga transaksi lain yang mencoba mengakses baris tersebut terpaksa menunggu transaksi yang mengunci baris selesai. Transaksi lain ini secara efektif dimasukkan ke dalam antrian yang diurutkan berdasarkan saat mereka mencoba membaca nilai baris yang dikunci

  • Saat mengganti nilai dalam satu baris, 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 dan tentukan nilai untuk semua kolom dalam baris yang disisipkan. Ini biasanya akan memiliki kinerja terbaik di bawah pertentangan, dibandingkan dengan kombinasi
    > 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)
    );
    
    6,
      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, dan
    > SELECT * FROM posts
              WHERE username = 'alyssa'
           ORDER BY post_timestamp DESC
              LIMIT 10;
    
    07

Tingkatkan kinerja transaksi dengan mengukur dan mengonfigurasi cluster

Untuk 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.