Berapa baris dalam database TERLALU BANYAK?


87

Saya memiliki tabel MySQL InnoDB dengan 1.000.000 catatan. Apakah ini terlalu berlebihan? Atau database dapat menangani ini dan lainnya? Saya bertanya karena saya perhatikan bahwa beberapa kueri (misalnya, mendapatkan baris terakhir dari tabel) lebih lambat (detik) di tabel dengan 1 milon baris daripada di satu dengan 100.

Jawaban:


114

Saya memiliki tabel MySQL InnoDB dengan 1000000 register. Apakah ini terlalu berlebihan?

Tidak, 1.000.000 baris (data AKA) tidak terlalu banyak untuk database.

Saya bertanya karena saya perhatikan bahwa beberapa kueri (misalnya, mendapatkan register terakhir dari sebuah tabel) lebih lambat (detik) di tabel dengan 1 juta register daripada di tabel dengan 100.

Ada banyak hal yang harus dipertanggungjawabkan dalam pernyataan itu. Tersangka yang biasa adalah:

  1. Kueri yang ditulis dengan buruk
  2. Tidak menggunakan kunci utama, dengan asumsi kunci tersebut ada di atas meja
  3. Model data yang dirancang dengan buruk (struktur tabel)
  4. Kurangnya indeks

4
5. Spesifikasi server yang ketinggalan jaman <Pilihan terakhir.
Sneakyness

19
@Brimstedt: Saya juga selalu berpikir kata benda harus "Indeks", tapi saya rasa saya tidak pernah melihat ada orang yang menggunakannya untuk database: dari Wikipedia: en.wikipedia.org/w/… ke Tn. Coding Horror: codinghorror. com / blog / archives / 000638.html . Ada posting SO yang menarik ini tentang topik: stackoverflow.com/questions/1001366 .
Daniel Vassallo

7
6. tidak cukup memori yang dialokasikan untuk berbagai cache innodb
Jason

untuk performa yang lebih baik apakah saya harus menggunakan PrimaryKey? Bagaimana dengan menggunakan kunci lain seperti Indeks, Unik? Bolehkah saya menggunakan ini terima kasih
user1844933

Mungkin komputer dipenuhi dengan memori seperti yang dikatakan Jason dan terputus di tengah proses
ytpillai

67

Saya memiliki database dengan lebih dari 97.000.000 catatan ( file data 30GB ), dan tidak mengalami masalah.

Ingatlah untuk mendefinisikan dan meningkatkan indeks tabel Anda .

Jadi jelaslah bahwa 1.000.000 bukanlah BANYAK! (Tetapi jika Anda tidak mengindeks; ya, BANYAK)


10
Apakah menambahkan "kunci utama" ke kolom (dengan memilih kenaikan otomatis) akan mengindeks?
Nathan

8
@Nathan, sebenarnya ketika Anda menetapkan kolom menjadi kunci utama, itu secara otomatis menjadi diindeks, tetapi setiap tabel hanya dapat memiliki satu kunci utama, jika Anda perlu menambahkan indeks untuk beberapa kolom, untuk mengoptimalkan kueri gunakan stackoverflow.com/
dav

Saya memiliki tabel dengan satu triliun tetapi memilih dalam format data LIFO lambat?
Saurabh Chandra Patel

Tentukan tidak mengalami masalah. Berapa lama waktu yang dibutuhkan untuk kueri paling kompleks? Kami memiliki tabel dengan 100 juta baris dan klien mengharapkan kueri diselesaikan dalam maksimal 5 detik, terlepas dari kriteria pengelompokan atau pemesanan yang mereka gunakan. Indeks kami dapat ditingkatkan tetapi sebelum kami mengunci semuanya mencoba menambahkan indeks
Joe Yahchouchi

20% tabel produksi (menurut studi lama) memiliki lebih dari 1 juta baris. Saya telah melihat beberapa dengan beberapa miliar baris.
Rick James

19

Gunakan 'jelaskan' untuk memeriksa kueri Anda dan lihat apakah ada yang salah dengan rencana kueri.


6
Meskipun ini adalah ide yang bagus, jawaban ini sendiri tidak baik untuk diberikan kepada seorang pemula. Output dari MENJELASKAN tidak terlalu intuitif ...
nickf

17
Tidak ada alat lain untuk membantu Anda memeriksa kueri, jadi lebih baik mulai belajar EXPLAIN- pemula atau tidak.
no

30
alangkah baiknya jika seseorang bisa MENJELASKAN EXPLAIN ;)
Jo E.


15

Saya pikir ini adalah kesalahpahaman umum - ukuran hanya salah satu bagian dari persamaan dalam hal skalabilitas database. Ada masalah lain yang sulit (atau lebih sulit):

  • Berapa besar set kerja (yaitu berapa banyak data yang perlu dimuat ke dalam memori dan dikerjakan secara aktif). Jika Anda hanya memasukkan data dan kemudian tidak melakukan apa-apa dengannya, itu sebenarnya masalah yang mudah dipecahkan.

  • Tingkat konkurensi apa yang diperlukan? Apakah hanya ada satu pengguna yang menyisipkan / membaca, atau apakah kami memiliki ribuan klien yang beroperasi sekaligus?

  • Tingkat janji / ketahanan dan konsistensi kinerja apa yang dibutuhkan? Apakah kita harus memastikan bahwa kita dapat menghormati setiap komitmen. Bolehkah jika transaksi rata-rata cepat, atau apakah kita ingin memastikan bahwa semua transaksi cepat andal (kontrol kualitas enam sigma seperti - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- dan-enam-sigma / ).

  • Apakah Anda perlu melakukan masalah operasional, seperti ALTER skema tabel? Dalam InnoDB hal ini dimungkinkan, tetapi sangat lambat karena sering kali harus membuat tabel sementara di latar depan (memblokir semua koneksi).

Jadi saya akan menyatakan dua masalah yang membatasi adalah:

  • Keahlian Anda sendiri dalam menulis kueri / memiliki indeks yang baik.
  • Berapa banyak rasa sakit yang dapat Anda toleransi menunggu pernyataan ALTER TABLE.

2
Edit: Saran tentang ALTER TABLE membuat tabel sementara agak ketinggalan jaman. MySQL 5.5 memiliki pembuatan indeks cepat, dan 5.6 sekarang memiliki DDL online.
Morgan Tocker

3

Jika yang Anda maksud adalah 1 juta baris, itu bergantung pada bagaimana pengindeksan Anda dilakukan dan konfigurasi perangkat keras Anda. Satu juta baris bukanlah jumlah yang besar untuk database perusahaan, atau bahkan database developer pada peralatan yang layak.

jika yang Anda maksud 1 juta kolom (tidak yakin itu mungkin di MySQL) maka ya, ini tampaknya agak besar dan mungkin akan menimbulkan masalah.


3

Daftar? Apakah maksud Anda rekor?

Satu juta catatan bukanlah masalah besar untuk database saat ini. Jika Anda mengalami masalah apa pun, kemungkinan besar bukan sistem database itu sendiri, melainkan perangkat keras tempat Anda menjalankannya. Anda tidak akan mengalami masalah dengan DB sebelum Anda kehabisan perangkat keras, kemungkinan besar.

Sekarang, jelas beberapa kueri lebih lambat daripada yang lain, tetapi jika dua kueri yang sangat mirip berjalan dalam waktu yang sangat berbeda, Anda perlu mencari tahu apa rencana eksekusi database dan mengoptimalkannya, yaitu menggunakan indeks yang benar, normalisasi yang tepat, dll.

Secara kebetulan, tidak ada yang namanya record "terakhir" dalam tabel, dari sudut pandang logis mereka tidak memiliki urutan yang melekat.


Maksud saya sesuatu seperti "PILIH * DARI tabel ORDER BY id DESC LIMIT 0"
Juanjo Conti

4
Mungkin Anda membutuhkan, SELECT LAST_INSERT_ID()bukan kueri itu.
True Soft

3

Saya telah melihat tabel yang tidak dipartisi dengan beberapa miliar catatan (terindeks), yang bergabung sendiri untuk pekerjaan analitis. Kami akhirnya mempartisi hal itu tetapi jujur ​​kami tidak melihat banyak perbedaan.

Konon, itu ada di Oracle dan saya belum menguji volume data itu di MySQL. Indeks adalah teman Anda :)


2

Dengan asumsi yang Anda maksud adalah "record" dengan "register" tidak, ini tidak terlalu banyak, MySQL berskala sangat baik dan dapat menyimpan record sebanyak yang Anda miliki di hard disk Anda.

Jelas meskipun permintaan pencarian akan lebih lambat. Tidak ada cara lain selain memastikan bahwa bidang diindeks dengan benar.


2
Secara teknis, ukuran tabel juga dapat dibatasi oleh ukuran file maksimal dari sistem file yang Anda gunakan.
tster

0

Semakin besar tabel (seperti semakin banyak baris di dalamnya), kueri yang lebih lambat biasanya akan berjalan jika tidak ada indeks. Setelah Anda menambahkan indeks yang tepat, kinerja kueri Anda akan meningkat atau setidaknya tidak menurun sebanyak tabel tumbuh. Namun, jika kueri itu sendiri mengembalikan lebih banyak baris saat tabel semakin besar, Anda akan mulai melihat degradasi lagi.

Meskipun baris 1M tidak terlalu banyak, itu juga tergantung pada berapa banyak memori yang Anda miliki di server DB. Jika tabel terlalu besar untuk di-cache dalam memori oleh server, maka kueri akan menjadi lebih lambat.


0

Menggunakan kueri yang disediakan akan sangat lambat karena menggunakan metode gabungan untuk mengurutkan data.

Saya akan merekomendasikan untuk memikirkan ulang desain sehingga Anda menggunakan indeks untuk mengambilnya atau memastikannya sudah dipesan dengan cara itu sehingga tidak diperlukan penyortiran.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.