มีกี่แถวในฐานข้อมูลที่มากเกินไป?


87

ฉันมีตาราง MySQL InnoDB ที่มีข้อมูล 1,000,000 รายการ นี่มันมากเกินไปหรือเปล่า? หรือฐานข้อมูลสามารถจัดการสิ่งนี้และอื่น ๆ ได้? ฉันถามเพราะฉันสังเกตเห็นว่าบางคำค้นหา (เช่นการรับแถวสุดท้ายจากตาราง) นั้นช้ากว่า (วินาที) ในตารางโดยมี 1 ล้านแถวมากกว่าในหนึ่งที่มี 100

คำตอบ:


114

ฉันมีตาราง MySQL InnoDB ที่มีการลงทะเบียน 1000000 นี่มันมากเกินไปหรือเปล่า?

ไม่ 1,000,000 แถว (บันทึก AKA) ไม่มากเกินไปสำหรับฐานข้อมูล

ฉันถามเพราะฉันสังเกตเห็นว่าบางคำค้นหา (เช่นการลงทะเบียนครั้งสุดท้ายของตาราง) นั้นช้ากว่า (วินาที) ในตารางโดยมี 1 ล้านรีจิสเตอร์มากกว่าใน 100

มีหลายสิ่งที่ต้องคำนึงถึงในคำสั่งนั้น ผู้ต้องสงสัยตามปกติคือ:

  1. ข้อความค้นหาที่เขียนไม่ดี
  2. ไม่ใช้คีย์หลักสมมติว่ามีอยู่บนโต๊ะด้วยซ้ำ
  3. โมเดลข้อมูลที่ออกแบบมาไม่ดี (โครงสร้างตาราง)
  4. ขาดดัชนี

4
5. ข้อกำหนดเซิร์ฟเวอร์ที่ล้าสมัย <วิธีสุดท้าย
ส่อเสียด

19
@Brimstedt: ฉันคิดเสมอว่าคำนามควรเป็น "ดัชนี" แต่ฉันไม่คิดว่าฉันเคยเห็นใครใช้มันสำหรับฐานข้อมูล: จาก Wikipedia: en.wikipedia.org/w/…ถึง Mr. Coding Horror: codinghorror com / blog / Archives / 000638.html . มีการโพสต์นี้ที่น่าสนใจในหัวข้อคือstackoverflow.com/questions/1001366
Daniel Vassallo

7
6. จัดสรรหน่วยความจำไม่เพียงพอสำหรับแคชต่างๆของ innodb
Jason

เพื่อประสิทธิภาพที่ดีขึ้นว่าต้องใช้ PrimaryKey ไหม แล้วการใช้คีย์อื่น ๆ เช่น Index, Unique ล่ะ? ฉันขอใช้สิ่งเหล่านี้ได้ไหม ขอบคุณ
user1844933

บางทีคอมพิวเตอร์อาจจะเต็มไปด้วยหน่วยความจำอย่างที่ Jason พูดและตัดออกไปกลางกระบวนการ
ytpillai

67

ฉันมีฐานข้อมูลที่มีข้อมูลมากกว่า97,000,000รายการ ( ดาต้าไฟล์30GB ) และไม่มีปัญหา

ก็อย่าลืมที่จะกำหนดและปรับปรุงตารางของคุณดัชนี

เห็นได้ชัดว่า1,000,000ไม่ใช่จำนวนมาก! (แต่ถ้าคุณไม่จัดทำดัชนีก็มีหลายอย่าง)


10
การเพิ่ม "คีย์หลัก" ลงในคอลัมน์ (โดยการเลือกการเพิ่มอัตโนมัติ) จะเป็นการจัดทำดัชนีหรือไม่
นาธาน

8
@ นาธานจริง ๆ แล้วเมื่อคุณกำหนดคอลัมน์ให้เป็นคีย์หลักคอลัมน์นั้นจะถูกสร้างดัชนีโดยอัตโนมัติ แต่ทุกตารางสามารถมีคีย์หลักได้เพียงคีย์เดียวหากคุณต้องการเพิ่มดัชนีสำหรับบางคอลัมน์เพื่อเพิ่มประสิทธิภาพการสืบค้นให้ใช้stackoverflow.com/
dav

ฉันมีตารางที่มีหนึ่งล้านล้าน แต่การเลือกข้อมูลในรูปแบบ LIFO ช้า?
Saurabh Chandra Patel

กำหนดไม่ให้มีปัญหา แบบสอบถามที่ซับซ้อนที่สุดใช้เวลานานแค่ไหน? เรามีตารางที่มี 100 ล้านแถวและลูกค้าคาดว่าการสืบค้นจะเสร็จสิ้นภายใน 5 วินาทีสูงสุดไม่ว่าจะใช้เกณฑ์การจัดกลุ่มหรือการสั่งซื้อ ดัชนีของเราสามารถปรับปรุงได้ แต่ก่อนที่เราจะล็อกทุกอย่างที่พยายามเพิ่มดัชนี
Joe Yahchouchi

20% ของตารางการผลิต (ตามการศึกษาเก่า) มีมากกว่า 1 ล้านแถว ฉันเคยเห็นสองสามแถวที่มีหลายพันล้านแถว
Rick James

19

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


6
แม้ว่านี่จะเป็นความคิดที่ดี แต่คำตอบนี้ก็ไม่เหมาะสำหรับมือใหม่ ผลลัพธ์จาก
EXPLAIN

17
ไม่มีเครื่องมืออื่นใดที่จะช่วยคุณตรวจสอบคำถามได้ดังนั้นควรเริ่มเรียนรู้กันดีกว่าEXPLAIN- มือใหม่หรือไม่
เลขที่

30
คงจะดีถ้ามีคนอธิบายได้ EXPLAIN ;)
Jo E.


15

ฉันคิดว่านี่เป็นความเข้าใจผิดทั่วไป - ขนาดเป็นเพียงส่วนหนึ่งของสมการเมื่อพูดถึงความสามารถในการปรับขนาดฐานข้อมูล มีปัญหาอื่น ๆ ที่ยาก (หรือยากกว่า):

  • ชุดการทำงานมีขนาดใหญ่เพียงใด (เช่นข้อมูลที่ต้องโหลดในหน่วยความจำและทำงานอย่างแข็งขัน) หากคุณเพียงแค่แทรกข้อมูลแล้วไม่ทำอะไรเลยมันเป็นปัญหาที่ง่ายในการแก้ไข

  • ต้องการการทำงานพร้อมกันในระดับใด มีการแทรก / อ่านผู้ใช้เพียงรายเดียวหรือเรามีลูกค้าหลายพันรายที่ทำงานพร้อมกันหรือไม่?

  • ต้องมีสัญญา / ความทนทานและความสม่ำเสมอของประสิทธิภาพในระดับใด เราต้องแน่ใจว่าเราสามารถให้เกียรติการกระทำแต่ละครั้ง จะเป็นไรไหมถ้าธุรกรรมโดยเฉลี่ยนั้นรวดเร็วหรือเราต้องการให้แน่ใจว่าธุรกรรมทั้งหมดนั้นรวดเร็วอย่างน่าเชื่อถือ (การควบคุมคุณภาพหกซิกม่าเช่น - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- และ-six-sigma / )

  • คุณต้องแก้ไขปัญหาในการดำเนินงานเช่นแก้ไขสคีมาของตารางหรือไม่ ใน InnoDB เป็นไปได้ แต่ช้าอย่างไม่น่าเชื่อเนื่องจากมักจะต้องสร้างตารางชั่วคราวในเบื้องหน้า (บล็อกการเชื่อมต่อทั้งหมด)

ดังนั้นฉันจะระบุว่าสองประเด็น จำกัด คือ:

  • ทักษะของคุณเองในการเขียนแบบสอบถาม / มีดัชนีที่ดี
  • คุณสามารถทนต่อความเจ็บปวดได้มากแค่ไหนในการรอคำสั่ง ALTER TABLE

2
แก้ไข: คำแนะนำเกี่ยวกับ ALTER TABLE การสร้างตารางชั่วคราวเป็นวันที่เล็กน้อย MySQL 5.5 มีการสร้างดัชนีที่รวดเร็วและ 5.6 ตอนนี้มี DDL ออนไลน์
Morgan Tocker

3

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

ถ้าคุณหมายถึง 1 ล้านคอลัมน์ (ไม่แน่ใจว่าเป็นไปได้ใน MySQL) ใช่ดูเหมือนว่าจะใหญ่ไปหน่อยและอาจทำให้เกิดปัญหา


3

ลงทะเบียน? คุณหมายถึงบันทึก?

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

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

อนึ่งไม่มีสิ่งที่เรียกว่าระเบียน "สุดท้าย" ในตารางจากมุมมองเชิงตรรกะพวกเขาไม่มีลำดับโดยธรรมชาติ


ฉันหมายถึงบางอย่างเช่น "SELECT * FROM table ORDER BY id DESC LIMIT 0"
Juanjo Conti

4
บางทีคุณอาจต้องการSELECT LAST_INSERT_ID()แทนการสืบค้นนั้น
True Soft

3

ฉันเคยเห็นตารางที่ไม่มีการแบ่งพาร์ติชันที่มีระเบียน (จัดทำดัชนี) หลายพันล้านรายการซึ่งเข้าร่วมด้วยตนเองสำหรับงานวิเคราะห์ ในที่สุดเราก็แบ่งส่วนของสิ่งนี้ แต่จริงๆแล้วเราไม่เห็นความแตกต่างมาก

นั่นคือใน Oracle และฉันยังไม่ได้ทดสอบปริมาณข้อมูลนั้นใน MySQL ดัชนีคือเพื่อนของคุณ :)


2

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

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


2
ในทางเทคนิคขนาดของตารางอาจถูก จำกัด ด้วยขนาดไฟล์สูงสุดของระบบไฟล์ที่คุณใช้
tster

0

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

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


0

การใช้แบบสอบถามที่ให้มาจะช้าเป็นพิเศษเนื่องจากใช้วิธีการผสานการเรียงลำดับเพื่อจัดเรียงข้อมูล

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

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