จำนวนเรคคอร์ดสูงสุดในตารางฐานข้อมูล MySQL


174

ขีด จำกัด สูงสุดของบันทึกสำหรับตารางฐานข้อมูล MySQL คืออะไร ฉันสงสัยเกี่ยวกับฟิลด์การบันทึกอัตโนมัติ จะเกิดอะไรขึ้นถ้าฉันเพิ่มบันทึกหลายล้านรายการ จะจัดการกับสถานการณ์แบบนี้ได้อย่างไร? ขอบคุณ!


16
ไม่ต้องพูดถึง GIGAWATTS 1.21!
Ben

2
อย่างน้อยถ้าหน่วยความจำทำหน้าที่ขีด จำกัด ถูกกำหนดโดยเอ็นจิ้นการจัดเก็บดังนั้น (ตัวอย่าง) โดยใช้ MyISAM คุณจะได้รับข้อ จำกัด ที่แตกต่างจากการใช้ InnoDB
Jerry Coffin

77
@ Onion-Knight: ฉันไม่เห็นด้วย เป็นเรื่องปกติที่จะแทรกแถวเป็นล้าน ๆแถวในตารางเดียวและฐานข้อมูลบางตัวมีขีด จำกัด ดังนั้นจึงควรถาม หากมีใครถามว่า MySQL รองรับตารางหลายล้านตารางหรือไม่นั่นอาจเป็นสัญญาณบ่งบอกถึงความผิดพลาดทางสถาปัตยกรรม
Bill Karwin

คำตอบ:


61

ชนิด mysql int สามารถทำแถวได้ไม่กี่แถว: http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

ได้รับการรับรองintความคุ้มค่าที่ใหญ่ที่สุดคือ4,294,967,295
ได้รับการรับรองbigintความคุ้มค่าที่ใหญ่ที่สุดคือ18,446,744,073,709,551,615


8
2147483647 สูงสุดดังนั้นคุณจะต้องสร้างรายการใหม่โดยอัตโนมัติหากคุณทำงานกับหลายพันล้านรายการ? (ซึ่งอาจจะทำให้งบเลือกของคุณละลายไปนานแล้ว)
Kzqai

2
@Tchalvak ที่มีไว้สำหรับการลงนามกรุณาอ่านเอกสาร mysql
ลีอันโดร

8
บริบทของคำถามนั้นเกี่ยวกับว่าเขตข้อมูลการเพิ่มอัตโนมัติสามารถจัดการกับแถวจำนวนมากได้หรือไม่และไม่ใช่ข้อ จำกัด ของทรัพยากรอื่น ๆ
KM

21
โปสเตอร์ไม่ได้ถามเกี่ยวกับตัวเลขหรือชนิดข้อมูลอื่น ๆ . ฉันไม่เข้าใจจริงๆว่าสิ่งนี้สามารถถูกตั้งค่าสถานะเป็นคำตอบที่ถูกต้อง แม้ว่าฉันต้องยอมรับว่าคำถามนั้นคลุมเครือเราควรแยกความแตกต่างระหว่างชนิดข้อมูล PK และจำนวนแถวสูงสุดสำหรับตาราง
Bery

1
@Bery, OP ได้แยกแยะว่าพวกเขาเป็นอย่างไรหลังจากเลือกสิ่งนี้เป็นคำตอบ เห็นได้ชัดว่าพวกเขามีความสนใจในความสามารถของฟิลด์การเพิ่มอัตโนมัติซึ่งคำตอบของฉันครอบคลุมและไม่ใช่ข้อ จำกัด ของทรัพยากรอื่น ๆ
กม.

238

ค่าที่ยิ่งใหญ่ที่สุดของจำนวนเต็มนั้นเกี่ยวข้องกับจำนวนแถวสูงสุดที่คุณสามารถเก็บไว้ในตารางได้เพียงเล็กน้อย

เป็นความจริงที่ว่าถ้าคุณใช้ int หรือ bigint เป็นคีย์หลักของคุณคุณสามารถมีได้หลายแถวตามจำนวนค่าที่ไม่ซ้ำกันในประเภทข้อมูลของคีย์หลักของคุณ แต่คุณไม่ต้องทำให้คีย์หลักเป็นจำนวนเต็ม คุณสามารถทำให้มันเป็น CHAR (100) คุณสามารถประกาศคีย์หลักเหนือคอลัมน์ได้มากกว่าหนึ่งคอลัมน์

มีข้อ จำกัด อื่น ๆ เกี่ยวกับขนาดตารางนอกเหนือจากจำนวนแถว ตัวอย่างเช่นคุณสามารถใช้ระบบปฏิบัติการที่มีข้อ จำกัด ขนาดไฟล์ หรือคุณอาจมีฮาร์ดไดรฟ์ 300GB ที่สามารถเก็บได้เพียง 300 ล้านแถวถ้าแต่ละแถวมีขนาด 1KB

ขีด จำกัด ของขนาดฐานข้อมูลสูงมาก:

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

เครื่องมือจัดเก็บ MyISAM รองรับ 2 32แถวต่อตาราง แต่คุณสามารถสร้าง MySQL ด้วย--with-big-tablesตัวเลือกเพื่อให้รองรับได้มากถึง 2 64แถวต่อตาราง

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

เอ็นจิ้นการจัดเก็บข้อมูลของ InnoDB ดูเหมือนจะไม่มีข้อ จำกัด เกี่ยวกับจำนวนแถว แต่มีข้อ จำกัด เกี่ยวกับขนาดของตารางที่ 64 เทราไบต์ จำนวนแถวที่พอดีนี้ขึ้นอยู่กับขนาดของแต่ละแถว


62
อึ - ฉันหวังว่าฉันจะได้อ่านเรื่องนี้มาก่อน ... ฉันเพิ่งเกินขนาด 64 เทราไบต์ของฉันบนหนึ่งในตารางของฉันและตอนนี้ระบบของฉันช้ามาก!
JM4

2 ^ 32 = 4,294,967,295 และ 2 ^ 64 = 18,446,744,073,709,551,615 ดังนั้น ... ค่าจำนวนเต็มที่มากที่สุดมีบิตที่เกี่ยวข้องกับจำนวนแถวสูงสุด ไม่จำเป็นต้องเป็นคีย์หลัก
teynon

1
@Tom, InnoDB เป็นเครื่องมือเก็บข้อมูลเริ่มต้นใน MySQL 5.5 และเป็นตัวเลือกที่ดีกว่าใน 99% ของกรณี
Bill Karwin

2
@ Ext3h การค้นหาสฟิงซ์มักจะเป็นตัวเลือกที่ดีกว่าดัชนีแบบเต็มใน MyISAM หรือ InnoDB
Bill Karwin

1
สำหรับ mysql 8 ขีด จำกัด คือ 256 TB ขนาดหน้า 64 KB
UselesssCat

13

ฉันขอแนะนำอย่าลบข้อมูล อย่าพูดว่าถ้าตารางยาวกว่า 1,000 ตัดปลายตาราง จำเป็นต้องมีตรรกะทางธุรกิจจริงในแผนของคุณเช่นผู้ใช้รายนี้ไม่ได้ใช้งานนานเท่าใด ตัวอย่างเช่นถ้ามันมีความยาวมากกว่า 1 ปีให้วางไว้ในตารางอื่น คุณจะให้สิ่งนี้เกิดขึ้นทุกสัปดาห์หรือทุกเดือนในสคริปต์การบำรุงรักษาในช่วงกลางของเวลาที่ช้า

เมื่อคุณพบแถวจำนวนมากในตารางของคุณคุณควรเริ่มแบ่งตารางหรือการแบ่งพาร์ติชันและใส่ข้อมูลเก่าในตารางเก่าตามปีเช่น users_2011_jan, users_2011_feb หรือใช้ตัวเลขสำหรับเดือน จากนั้นเปลี่ยนโปรแกรมของคุณให้ทำงานกับรุ่นนี้ อาจสร้างตารางใหม่โดยใช้ข้อมูลน้อยลงเพื่อสรุปข้อมูลในคอลัมน์ที่น้อยลงแล้วอ้างถึงตารางที่มีการแบ่งพาร์ติชันที่ใหญ่กว่าเมื่อคุณต้องการข้อมูลเพิ่มเติมเช่นเมื่อผู้ใช้ดูโปรไฟล์ของพวกเขา ทั้งหมดนี้ควรได้รับการพิจารณาอย่างรอบคอบดังนั้นในอนาคตไม่แพงเกินกว่าที่จะพิจารณาปัจจัยใหม่ได้ คุณสามารถใส่เฉพาะผู้ใช้ที่มาถึงไซต์ของคุณตลอดเวลาในตารางเดียวและผู้ใช้ที่ไม่เคยมาในชุดของตารางที่เก็บถาวร


1
ในเรื่องนี้มันมีประโยชน์มากในการดูการแบ่งพาร์ติชันของ MySQL: dev.mysql.com/doc/refman/5.6/en/partitioning.html
Wim Deblauwe

10

ใน InnoDB มีข้อ จำกัด เกี่ยวกับขนาดของตาราง 64 เทราไบต์และขีด จำกัด ขนาดแถวของ MySQL ที่ 65,535 สามารถมี 1,073,741,824 แถว นั่นคือจำนวนระเบียนขั้นต่ำที่ใช้ขีด จำกัด ขนาดแถวสูงสุด อย่างไรก็ตามสามารถเพิ่มระเบียนได้มากขึ้นหากขนาดแถวมีขนาดเล็กลง


สำหรับการจัดเก็บแถว (1,073,741,824) แถวนี้โดยมีขีด จำกัด แถวที่ 65535 ต้องใช้ขนาดฮาร์ดดิสก์เท่าใด กรุณาแนะนำ
davidb

1
ขนาดของฮาร์ดดิสก์ที่ต้องการไม่สามารถพิจารณาได้ตามจำนวนแถวและขนาดแถวเดียว ขนาดตารางตัวเองจะเป็น 64 เทราไบต์ อย่างไรก็ตามข้อมูลของคอลัมน์ TEXT และ BLOB จะถูกจัดเก็บแยกต่างหากจากแถวและจะต้องใช้พื้นที่เพิ่มเติม นอกจากนี้ยังขึ้นอยู่กับจำนวนและประเภทของคอลัมน์ TEXT และ BLOB เนื่องจากขนาดจะแตกต่างกันไปตามประเภท คอลัมน์ TEXT มีสี่ประเภท ได้แก่ TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT นอกจากนี้ยังมีคอลัมน์ BLOB สี่ประเภท ได้แก่ TINYBLOB, MEDIUMBLOB, BLOB และ LONGBLOB
Xylo

2

ตามส่วน Scalability and Limits ในhttp://dev.mysql.com/doc/refman/5.6/en/features.html , MySQL รองรับฐานข้อมูลขนาดใหญ่ พวกเขาใช้ MySQL Server กับฐานข้อมูลที่มี 50 ล้านบันทึก ผู้ใช้บางคนใช้เซิร์ฟเวอร์ MySQL ที่มี 200,000 ตารางและประมาณ 5,000,000,000 แถว


มันจะช่วยได้ถ้าคุณแจ้งให้เราทราบด้วยว่าฮาร์ดแวร์ชนิดใด "พวกเขา" กำลังใช้งานอยู่
account_ram ของฉัน

แน่นอนคุณพูดถูก แต่น่าเสียดายที่ 'พวกเขา' ไม่ได้ทำอะไรเกี่ยวกับฮาร์ดแวร์
ข้อมูล

@myaccount_ram ขอโทษที่ต้องรู้เรื่องนี้ แต่ถ้าเป็นประโยชน์ฉันได้เห็นการใช้งานจริงในทางทฤษฎีน้อยกว่าข้อ จำกัด ที่เป็นประโยชน์มากขึ้นของการผลิต MySQL ในการดำเนินการ ฉันเห็นฐานข้อมูลที่ ~ 18 พันล้านแถวใน 2x db.r4.16xlarge AWS (1 ผู้อ่าน 1 ผู้เขียน) แต่ละเครื่องมีคอร์ 64 CPU, ram 488GB, ลิงก์เครือข่าย 25Gbps, ดิสก์ 64TB ขนาดของฐานข้อมูลนี้ถูกผลักทั้งขีด จำกัด ของ CPU และขนาดดิสก์และ AWS ไม่ได้จัดเตรียมอินสแตนซ์ที่ปรับให้เหมาะสมกับฐานข้อมูลขนาดใหญ่กว่า มันถูกแทนที่ด้วย db schema ที่ง่ายกว่าซึ่งไม่ต้องการแถวจำนวนมาก
Skylar Brown

1

ขีด จำกัด ขนาดแถว

The maximum row size for a given table is determined by several factors:
  • การเป็นตัวแทนภายในของตาราง MySQL มีขีด จำกัด ขนาดแถวสูงสุด 65,535 ไบต์แม้ว่าเอ็นจิ้นการจัดเก็บจะสามารถรองรับแถวขนาดใหญ่ได้ คอลัมน์ BLOB และ TEXT สนับสนุนขนาด 9 ถึง 12 ไบต์ต่อขนาด จำกัด ของแถวเนื่องจากเนื้อหาจะถูกจัดเก็บแยกต่างหากจากส่วนที่เหลือของแถว

  • ขนาดแถวสูงสุดสำหรับตาราง InnoDB ซึ่งนำไปใช้กับข้อมูลที่เก็บไว้ภายในหน้าฐานข้อมูลน้อยกว่าครึ่งหน้าเล็กน้อย ตัวอย่างเช่นขนาดแถวสูงสุดคือน้อยกว่า 8KB เล็กน้อยสำหรับขนาดหน้าเริ่มต้น 16KB InnoDB ซึ่งกำหนดโดยตัวเลือกการกำหนดค่า innodb_page_size “ ข้อ จำกัด ของ InnoDB Tables

  • หากแถวที่มีคอลัมน์ที่มีความยาวแปรผันเกินขนาดแถวสูงสุดของ InnoDB InnoDB จะเลือกคอลัมน์ที่มีความยาวผันแปรสำหรับการจัดเก็บนอกหน้าจนกว่าแถวจะพอดีภายในขีด จำกัด ขนาดแถว InnoDB จำนวนข้อมูลที่เก็บไว้ในเครื่องสำหรับคอลัมน์ที่มีความยาวผันแปรได้ซึ่งถูกเก็บไว้นอกหน้าจะแตกต่างกันไปตามรูปแบบแถว สำหรับข้อมูลเพิ่มเติมโปรดดู“ รูปแบบแถวเก็บ InnoDB และรูปแบบแถว
  • รูปแบบการจัดเก็บข้อมูลที่แตกต่างกันใช้จำนวนส่วนหัวของหน้าและข้อมูลตัวอย่างที่แตกต่างกันซึ่งมีผลต่อจำนวนของที่เก็บข้อมูลสำหรับแถว

1

ลิงค์ http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

ขีด จำกัด ขนาดแถว

ขนาดแถวสูงสุดสำหรับตารางที่กำหนดถูกกำหนดโดยปัจจัยหลายประการ:

การเป็นตัวแทนภายในของตาราง MySQL มีขีด จำกัด ขนาดแถวสูงสุด 65,535 ไบต์แม้ว่าเอ็นจิ้นการจัดเก็บจะสามารถรองรับแถวขนาดใหญ่ได้ คอลัมน์ BLOB และ TEXT สนับสนุนขนาด 9 ถึง 12 ไบต์ต่อขนาด จำกัด ของแถวเนื่องจากเนื้อหาจะถูกจัดเก็บแยกต่างหากจากส่วนที่เหลือของแถว

ขนาดแถวสูงสุดสำหรับตาราง InnoDB ซึ่งใช้กับข้อมูลที่เก็บไว้ภายในหน้าฐานข้อมูลน้อยกว่าครึ่งหน้าเล็กน้อยสำหรับการตั้งค่า 4KB, 8KB, 16KB, 16KB และ 32KB เล็กน้อย ตัวอย่างเช่นขนาดแถวสูงสุดคือน้อยกว่า 8KB เล็กน้อยสำหรับขนาดหน้าเริ่มต้น 16KB InnoDB สำหรับหน้า 64KB ขนาดแถวสูงสุดคือน้อยกว่า 16KB เล็กน้อย ดูหัวข้อ 15.8.8“ ข้อ จำกัด บนตาราง InnoDB”

หากแถวที่มีคอลัมน์ที่มีความยาวแปรผันเกินขนาดแถวสูงสุดของ InnoDB InnoDB จะเลือกคอลัมน์ที่มีความยาวผันแปรสำหรับการจัดเก็บนอกหน้าจนกว่าแถวจะพอดีภายในขีด จำกัด ขนาดของแถว InnoDB จำนวนข้อมูลที่เก็บไว้ในเครื่องสำหรับคอลัมน์ที่มีความยาวผันแปรได้ซึ่งจัดเก็บอยู่นอกหน้าจะแตกต่างกันไปตามรูปแบบแถว สำหรับข้อมูลเพิ่มเติมดูหัวข้อ 15.11“ รูปแบบการจัดเก็บแถวและรูปแบบแถวของ InnoDB”

รูปแบบการจัดเก็บที่แตกต่างกันใช้จำนวนส่วนหัวของหน้าและข้อมูลตัวอย่างที่แตกต่างกันซึ่งมีผลต่อจำนวนที่เก็บข้อมูลสำหรับแถว

สำหรับข้อมูลเกี่ยวกับรูปแบบแถว InnoDB ดูหัวข้อ 15.11“ รูปแบบแถวเก็บและแถวของ InnoDB” และส่วน 15.8.3“ โครงสร้างแถวทางกายภาพของตาราง InnoDB”

สำหรับข้อมูลเกี่ยวกับรูปแบบการจัดเก็บ MyISAM ดูส่วน 16.2.3“ รูปแบบการจัดเก็บตาราง MyISAM”

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


-3

ไม่มีขีด จำกัด ขึ้นอยู่กับหน่วยความจำว่างและขนาดไฟล์สูงสุดของระบบเท่านั้น แต่นั่นไม่ได้หมายความว่าคุณไม่ควรใช้มาตรการป้องกันในการจัดการหน่วยความจำในฐานข้อมูลของคุณ สร้างสคริปต์ที่สามารถลบแถวที่ไม่มีการใช้งานได้เสมอหรือจะไม่เก็บจำนวนแถวทั้งหมดในรูปใดรูปหนึ่งพัน


8
การลบแถวที่คุณคิดว่า 'ใช้งานไม่ได้' นั้นเป็นอันตรายและทำให้เกิดปัญหามากกว่าที่จะแก้ไข ผู้พัฒนาก่อนหน้านี้ในหนึ่งในโครงการของฉันใช้สคริปต์ที่ลบตะกร้าสินค้าในรถเข็นที่มีอายุเกินกว่าสามวันโดยคิดว่าเขาทำสิ่งที่ถูกต้อง คาดเดาสิ่งที่มันทำให้เกิดปัญหารายสัปดาห์ ลบข้อมูลเฉพาะในกรณีที่คุณต้องการ
Ben Hitchcock

กรณีที่แย่กว่านั้นคือเมื่อบางคนเริ่มเก็บเส้นทางของไฟล์ในฐานข้อมูล ... ไม่เลยที่ไฟล์โปรเจคทั้งหมดของฉันไป .... ฉันมีโปรเจ็กต์เล็ก ๆ ที่เริ่มต้นด้วยไฟล์ 3.5M เดาว่า ... พวกมันไม่ใช่ทั้งหมด ใช้บ่อย
Kendrick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.