Jumlah maksimum catatan dalam tabel database MySQL

174

Apa batas atas catatan untuk tabel database MySQL. Saya bertanya-tanya tentang bidang peningkatan otomatis. Apa yang akan terjadi jika saya menambahkan jutaan catatan? Bagaimana cara menangani situasi semacam ini? Terima kasih!

xpepermint
sumber
16
Belum lagi 1.21 GIGAWATTS!
Ben
2
Setidaknya jika ingatanku, batasnya ditentukan oleh mesin penyimpanan, jadi (misalnya) menggunakan MyISAM Anda mendapatkan batas yang berbeda dari menggunakan InnoDB.
Jerry Coffin
77
@ Onion-Knight: Saya tidak setuju. Adalah normal untuk memasukkan jutaan baris dalam satu tabel, dan beberapa database memang memiliki batas, jadi patut ditanyakan. Jika seseorang bertanya apakah MySQL mendukung jutaan tabel maka itu mungkin merupakan tanda kesalahan arsitektur.
Bill Karwin

Jawaban:

61

tipe int mysql dapat melakukan beberapa baris: http://dev.mysql.com/doc/refman/5.0/id/numeric-types.html

unsigned intnilai terbesar adalah 4,294,967,295
unsigned bigintnilai terbesar adalah18,446,744,073,709,551,615

KM.
sumber
8
2147483647 maks, jadi Anda hanya perlu membuat peningkatan otomatis jika Anda bekerja dengan beberapa miliar entri? (yang mungkin hanya akan membuat pernyataan pilih Anda meleleh jauh sebelum itu)
Kzqai
2
@Tchalvak itu untuk int yang ditandatangani, baca dokumentasi mysql.
Leandro
8
Konteks pertanyaannya adalah tentang apakah bidang kenaikan otomatis dapat menangani banyak baris, dan bukan keterbatasan sumber daya lainnya
KM.
21
Poster tidak bertanya tentang angka atau tipe data lainnya. . Saya benar-benar tidak mengerti bagaimana ini dapat ditandai sebagai jawaban yang benar. Meskipun saya harus mengakui bahwa pertanyaannya ambigu, kita harus membedakan antara tipe data PK dan jumlah maksimum baris untuk tabel.
Bery
1
@Bery, OP telah membedakan apa yang mereka cari dengan memilih ini sebagai jawaban mereka. Rupanya mereka tertarik pada kapasitas bidang kenaikan otomatis, yang dijawab oleh saya, dan bukan keterbatasan sumber daya lainnya.
KM.
238

Nilai terbesar dari bilangan bulat tidak ada hubungannya dengan jumlah maksimum baris yang dapat Anda simpan dalam sebuah tabel.

Memang benar bahwa jika Anda menggunakan int atau bigint sebagai kunci utama Anda, Anda hanya dapat memiliki baris sebanyak jumlah nilai unik dalam tipe data kunci utama Anda, tetapi Anda tidak harus membuat kunci primer Anda bilangan bulat , Anda bisa menjadikannya CHAR (100). Anda juga bisa mendeklarasikan kunci utama lebih dari satu kolom.

Ada kendala lain pada ukuran tabel selain jumlah baris. Misalnya Anda dapat menggunakan sistem operasi yang memiliki batasan ukuran file. Atau Anda bisa memiliki hard drive 300GB yang dapat menyimpan hanya 300 juta baris jika setiap baris berukuran 1KB.

Batas ukuran basis data sangat tinggi:

http://dev.mysql.com/doc/refman/5.1/en/source-configuration-options.html

Mesin penyimpanan MyISAM mendukung 2 32 baris per tabel, tetapi Anda dapat membangun MySQL dengan --with-big-tablesopsi untuk membuatnya mendukung hingga 2 64 baris per tabel.

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

Mesin penyimpanan InnoDB tampaknya tidak memiliki batasan jumlah baris, tetapi memiliki batas ukuran tabel 64 terabyte. Berapa banyak baris yang cocok dengan ini tergantung pada ukuran setiap baris.

Bill Karwin
sumber
62
omong kosong - saya berharap saya akan membaca ini sebelumnya ... saya hanya melampaui ukuran 64 terrabyte saya di salah satu meja saya dan sekarang sistem saya sangat lambat!
JM4
2 ^ 32 = 4.294.967.295 dan 2 ^ 64 = 18.446.744.073.709.551.615 jadi ... Nilai integer terbesar memang ada hubungannya dengan jumlah baris maksimum. Belum tentu kunci utama.
Teynon
1
@ Tom, InnoDB adalah mesin penyimpanan default di MySQL 5.5, dan merupakan pilihan yang lebih baik dalam 99% kasus.
Bill Karwin
2
@ Ext3h, Pencarian Sphinx biasanya merupakan pilihan yang lebih baik daripada indeks teks lengkap di MyISAM atau InnoDB.
Bill Karwin
1
Untuk mysql 8 batasnya adalah 256 TB dengan ukuran halaman 64 KB.
UselesssCat
13

Saya sarankan, jangan pernah menghapus data. Jangan katakan jika tabel lebih panjang dari 1000 memotong ujung tabel. Harus ada logika bisnis nyata dalam rencana Anda seperti berapa lama pengguna ini tidak aktif. Misalnya, jika lebih dari 1 tahun maka letakkan di tabel yang berbeda. Anda akan memiliki ini terjadi mingguan atau bulanan dalam skrip pemeliharaan di tengah waktu yang lambat.

Ketika Anda mengalami banyak baris di tabel Anda maka Anda harus mulai sharding tabel atau partisi dan meletakkan data lama di tabel lama dengan tahun seperti users_2011_jan, users_2011_feb atau menggunakan angka untuk bulan itu. Kemudian ubah pemrograman Anda untuk bekerja dengan model ini. Mungkin membuat tabel baru dengan informasi lebih sedikit untuk merangkum data dalam kolom lebih sedikit dan kemudian hanya merujuk ke tabel dipartisi lebih besar ketika Anda membutuhkan informasi lebih lanjut seperti ketika pengguna melihat profil mereka. Semua ini harus dipertimbangkan dengan sangat hati-hati sehingga di masa depan tidak terlalu mahal untuk faktor ulang. Anda juga bisa menempatkan hanya pengguna yang datang ke situs Anda sepanjang waktu dalam satu tabel dan pengguna yang tidak pernah datang dalam kumpulan tabel yang diarsipkan.

PHPGuru
sumber
1
Dalam hal ini, sangat berguna untuk melihat partisi MySQL: dev.mysql.com/doc/refman/5.6/en/partitioning.html
Wim Deblauwe
10

Di InnoDB, dengan batas ukuran tabel 64 terabyte dan batas ukuran baris MySQL 65.535, mungkin ada 1.073.741.824 baris. Itu akan menjadi jumlah minimum rekaman yang menggunakan batas ukuran baris maksimum. Namun, lebih banyak catatan dapat ditambahkan jika ukuran baris lebih kecil.

Xylo
sumber
untuk menyimpan sebanyak ini (1.073.741.824) baris dengan batas-baris 65535, berapa banyak ukuran hard disk yang diperlukan? tolong sarankan
davidb
1
Ukuran hard disk yang diperlukan tidak dapat ditentukan berdasarkan jumlah baris dan ukuran baris saja. Ukuran tabel itu sendiri akan menjadi 64 terabyte. Namun, data kolom TEKS dan BLOB disimpan terpisah dari baris dan akan membutuhkan ruang tambahan. Selain itu, itu akan tergantung pada jumlah dan jenis kolom TEKS dan BLOB karena ukuran bervariasi tergantung pada jenisnya. Ada empat jenis kolom TEXT yaitu, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT. Ada juga empat jenis kolom BLOB yaitu, TINYBLOB, MEDIUMBLOB, BLOB dan LONGBLOB.
Xylo
2

Menurut bagian Skalabilitas dan Batas di http://dev.mysql.com/doc/refman/5.6/en/features.html , dukungan MySQL untuk database besar. Mereka menggunakan MySQL Server dengan database yang berisi 50 juta catatan. Beberapa pengguna menggunakan Server MySQL dengan 200.000 tabel dan sekitar 5.000.000.000 baris.

Data
sumber
ini bisa membantu jika Anda juga memberi tahu kami apa yang menggunakan perangkat keras "Mereka"
my account_ram
Memang benar. Namun sayangnya 'mereka' tidak melakukan apa-apa tentang perangkat keras
Data
@ myaccount_ram maaf untuk membatalkan ini, tetapi jika ini membantu saya telah melihat kurang teoritis, batas lebih praktis dari produksi MySQL dalam tindakan. Saya telah melihat database yang ~ 18 miliar baris pada instance AWS 2x db.r4.16xlarge besar (1 pembaca, 1 penulis). Masing-masing mesin memiliki 64 core CPU, 488GB ram, 25Gbps link jaringan, 64TB disk. Skala db ini mendorong batas ukuran CPU dan disk dan AWS tidak memberikan contoh DB yang dioptimalkan lebih besar. Itu diganti dengan skema db sederhana yang tidak memerlukan banyak baris.
Skylar Brown
1

Batas Ukuran Baris

The maximum row size for a given table is determined by several factors:
  • Representasi internal tabel MySQL memiliki batas ukuran baris maksimum 65.535 byte, bahkan jika mesin penyimpanan mampu mendukung baris yang lebih besar. Kolom BLOB dan TEXT hanya berkontribusi 9 hingga 12 byte terhadap batas ukuran baris karena kontennya disimpan secara terpisah dari bagian baris lainnya.

  • Ukuran baris maksimum untuk tabel InnoDB, yang berlaku untuk data yang disimpan secara lokal dalam halaman database, sedikit kurang dari setengah halaman. Misalnya, ukuran baris maksimum sedikit kurang dari 8KB untuk ukuran halaman 16KB InnoDB default, yang ditentukan oleh opsi konfigurasi innodb_page_size. " Batas pada Tabel InnoDB ".

  • Jika baris yang berisi kolom panjang variabel melebihi ukuran baris InnoDB maksimum, InnoDB memilih kolom panjang variabel untuk penyimpanan di luar halaman hingga baris tersebut sesuai dengan batas ukuran baris InnoDB. Jumlah data yang disimpan secara lokal untuk kolom panjang variabel yang disimpan di luar halaman berbeda menurut format baris. Untuk informasi lebih lanjut, lihat “ Penyimpanan Baris InnoDB dan Format Baris ”.
  • Format penyimpanan yang berbeda menggunakan jumlah halaman header dan trailer yang berbeda, yang memengaruhi jumlah penyimpanan yang tersedia untuk baris.
Saurabh Chandra Patel
sumber
1

Tautan http://dev.mysql.com/doc/refman/5.7/id/column-count-limit.html

Batas Ukuran Baris

Ukuran baris maksimum untuk tabel tertentu ditentukan oleh beberapa faktor:

Representasi internal tabel MySQL memiliki batas ukuran baris maksimum 65.535 byte, bahkan jika mesin penyimpanan mampu mendukung baris yang lebih besar. Kolom BLOB dan TEXT hanya berkontribusi 9 hingga 12 byte terhadap batas ukuran baris karena kontennya disimpan secara terpisah dari bagian baris lainnya.

Ukuran baris maksimum untuk tabel InnoDB, yang berlaku untuk data yang disimpan secara lokal dalam halaman database, sedikit kurang dari setengah halaman untuk pengaturan 4KB, 8KB, 16KB, dan 32KB innodb_page_size. Misalnya, ukuran baris maksimum sedikit kurang dari 8KB untuk ukuran halaman 16KB InnoDB default. Untuk halaman 64KB, ukuran baris maksimum sedikit kurang dari 16KB. Lihat Bagian 15.8.8, “Batas pada Tabel InnoDB”.

Jika baris yang berisi kolom panjang variabel melebihi ukuran baris InnoDB maksimum, InnoDB memilih kolom panjang variabel untuk penyimpanan di luar halaman hingga baris tersebut sesuai dengan batas ukuran baris InnoDB. Jumlah data yang disimpan secara lokal untuk kolom panjang variabel yang disimpan di luar halaman berbeda menurut format baris. Untuk informasi lebih lanjut, lihat Bagian 15.11, “Penyimpanan Baris InnoDB dan Format Baris”.

Format penyimpanan yang berbeda menggunakan jumlah halaman header dan trailer yang berbeda, yang memengaruhi jumlah penyimpanan yang tersedia untuk baris.

Untuk informasi tentang format baris InnoDB, lihat Bagian 15.11, "Penyimpanan Baris InnoDB dan Format Baris", dan Bagian 15.8.3, "Struktur Baris Fisik Tabel InnoDB".

Untuk informasi tentang format penyimpanan MyISAM, lihat Bagian 16.2.3, “Format Penyimpanan Tabel MyISAM”.

http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

Md Nazrul Islam
sumber
-3

Tidak ada batasan. Itu hanya tergantung pada memori bebas Anda dan ukuran file maksimum sistem. Tapi itu tidak berarti Anda tidak harus mengambil tindakan pencegahan dalam menangani penggunaan memori di database Anda. Selalu buat skrip yang dapat menghapus baris yang tidak digunakan atau yang akan menjaga jumlah total baris dalam angka tertentu, katakan seribu.

9jamkt
sumber
8
Menghapus baris yang menurut Anda 'tidak digunakan' berbahaya, dan menyebabkan lebih banyak masalah daripada menyelesaikannya. Pengembang sebelumnya di salah satu proyek saya menerapkan skrip yang menghapus keranjang belanja lebih dari tiga hari, mengira ia melakukan hal yang benar. Coba tebak, itu menyebabkan masalah mingguan. Hapus data hanya jika Anda benar-benar perlu.
Ben Hitchcock
kasus yang lebih buruk adalah ketika seseorang mulai menyimpan path file dalam database ... di mana semua file proyek saya pergi .... saya punya proyek kecil yang dimulai pada file 3.5M menebak apa ... mereka tidak semua sering digunakan.
Kendrick