DBMS ใดที่เหมาะสำหรับการอ่านที่รวดเร็วและโครงสร้างข้อมูลแบบง่าย?


16

ฉันกำลังพัฒนาผลิตภัณฑ์ซึ่งเป็นส่วนหนึ่งของการทำงานของมันจะต้องติดตามไฟล์ / ไดเรกทอรีจำนวนมาก แนวคิดคือการเก็บข้อมูลสถิติในฐานข้อมูลจากนั้นเมื่อบู๊ตเครื่องจะสร้างการเฝ้าดูสำหรับแต่ละไฟล์ ไฟล์ที่เปลี่ยนแปลงจะถูกจัดคิว (ในฐานข้อมูล) สำหรับการซิงค์กลุ่มกับฐานข้อมูลระยะไกล พวกเขาจะซิงค์ตามลำดับความสำคัญหมายเลขระหว่าง 1-10

ข้อมูลเกี่ยวกับฐานข้อมูล:

  • <100,000 รายการของข้อมูลสถิติ
  • ฐานข้อมูลทั้งหมดอ่านเมื่อบูตเฉพาะเส้นทางไฟล์ที่จำเป็นเท่านั้น
  • ไฟล์ที่จัดคิวจะมีช่องบุริมภาพ (ไม่จำเป็นต้องค้นหาอะไรอีก)
  • การแทรกอาจช้า

ฉันพบฐานข้อมูลสองสามตัวที่ฉันคิดว่าจะใช้งานได้ แต่ฉันไม่แน่ใจว่าจะใช้ฐานข้อมูลใดดีที่สุด:

  • Redis - เก็บเส้นทางไฟล์เป็นคีย์ข้อมูลสถิติเป็นค่า คิวจะเป็นรายการ
  • MongoDB - ตัวเลือกการสืบค้นมากกว่า Redis แต่ยังเร็ว

ฉันคิดว่าฐานข้อมูล NoSQL จะเป็นทางออกที่ดีที่สุดที่นี่เนื่องจากไม่มีความสัมพันธ์เชิงตรรกะมากเกินไปและขนาดของข้อมูลโดยรวมไม่ใหญ่เกินไป (เช่น <100 mb ใกล้เคียงกับ <30 mb) ฉันดู SQLite เพราะมันดูเหมือนง่ายพอที่จะฝังในแอปพลิเคชันที่ติดตั้งได้

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

ดังนั้นคำถามฐานข้อมูลใดที่เหมาะสมที่สุดสำหรับสถานการณ์นี้

นอกจากนี้ยังมีฐานข้อมูลอื่น ๆ ที่เหมาะสมสำหรับแอปพลิเคชันเช่นนี้หรือไม่

คำตอบ:


9

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

ดังนั้นคำแนะนำของฉันคือไปกับฐานข้อมูลที่คุณคุ้นเคย หากคุณคุ้นเคยกับ Redis หรือ MongoDB ให้ไปกับหนึ่งในนั้น หากคุณคุ้นเคยกับ SQLite มากขึ้นให้เลือกสิ่งนั้น

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


ใช่ฐานข้อมูลขนาดนั้นน่าจะแสดงออกมาจากหน่วยความจำทั้งหมด
Nick Chammas

1
ฉันคุ้นเคยกับ MySQL (แต่เป็นปี), CouchDB และ Redis (เพิ่งเริ่มต้น) และฉันมีโครงสร้างที่คล้ายกันใน SQLite ที่ฉันสามารถอ้างอิงได้ ฉันเดาด้วย db ขนาดนี้มันไม่สำคัญมากเกินไป
beatgammit

12

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

เอ็นจิ้นการจัดเก็บ MyISAM มีตัวเลือกที่ช่วยให้สามารถเพิ่มโครงสร้างทางกายภาพของตารางเพื่อประสิทธิภาพที่ดีขึ้น ตัวเลือกนั้นคืออะไร? ตัวเลือกแก้ไขตาราง ROW_FORMAT

ตัวอย่างเช่นหนังสือออกแบบฐานข้อมูล MySQL และปรับแต่งแนะนำให้ใช้ ROW_FORMAT = FIXED ในหน้า 72,73 สิ่งนี้จะแปลงเขตข้อมูล VARCHAR ทั้งหมดเป็น CHAR มันจะทำให้ตาราง MyISAM ใหญ่ขึ้น แต่ทำการเลือก SELECT กับมันจะเร็วขึ้นมาก ฉันสามารถยืนยันถึงสิ่งนี้เป็นการส่วนตัว ฉันเคยมีตารางที่ 1.9GB ฉันเปลี่ยนรูปแบบด้วย ALTER TABLE tblname ROW_FORMAT = FIXED ตารางสิ้นสุดลง 3.7GB ความเร็วของ SELECT ต่อมันเร็วขึ้น 20-25% โดยไม่ต้องปรับปรุงหรือเปลี่ยนแปลงอะไรเลย

ถ้าคุณมีตาราง MyISAM ที่มีข้อมูลอยู่แล้ว? คุณสามารถรับเมทริกสำหรับคำจำกัดความของคอลัมน์ที่แนะนำโดยอิงจากข้อมูลที่มีอยู่ในตาราง MyISAM แบบสอบถามใดนำเสนอการวัดเหล่านั้น

SELECT * FROM tblname PROCEDURE ANALYSE();

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

นี่คือสิ่งอื่นที่ควรพิจารณา: เมื่อคุณคิดที่จะใช้ NoSQL DB คุณเคยคิดที่จะใช้ MyISAM ในรูปแบบ NoSQL หรือไม่? เป็นไปได้ทีเดียว หน้า 175 ของหนังสือเล่มเดียวกันที่ฉันพูดถึงแนะนำให้ใช้โครงสร้างของด้ามจับเพื่ออ่านตารางโดยไม่มีสัมภาระที่เกี่ยวข้อง อันที่จริงแล้วหน้า 175 ให้ตัวอย่างนี้:

CREATE TABLE customer_mileage_details
(
    customer_id INT NOT NULL,
    ff_number CHAR(10) NOT NULL,
    transaction_date DATE NOT NULL,
    mileage SMALLINT NOT NULL,
    INSERT(customer_id),
    INSERT (ff_number,transaction_date)
) ENGINE = MYISAM;

ตารางนี้มีหลายล้านแถว สมมติว่าคุณต้องการสร้างการวิเคราะห์ข้อมูลที่มีข้อกำหนดดังต่อไปนี้:

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

คำสั่งเหล่านี้อนุญาตให้อ่านอย่างรวดเร็วและสกปรกจากตาราง:

HANDLER customer_mileage_details OPEN;
HANDLER customer_mileage_details READ ff_number FIRST WHERE ff_number=('aaetm-4441');
HANDLER customer_mileage_details READ NEXT LIMT 10;
HANDLER customer_mileage_details CLOSE;

ฉันหวังว่านี่จะให้อาหารสำหรับความคิด โปรดดูมัน

ข้อแม้

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


1
จุดที่น่าสนใจเกี่ยวกับการใช้ MySQL เป็นฐานข้อมูล NoSQL แต่สิ่งนี้จะซื้อฉันมากกว่าการใช้บางอย่างเช่น Redis หรือ MongoDB?
beatgammit

1
คำตอบที่รวดเร็วและสกปรก? หากคุณจำเป็นต้องกลับไปใช้โมเดลเชิงสัมพันธ์แม้เพียงเพื่อจุดประสงค์ในการรายงานระฆังและนกหวีดทั้งหมดก็พร้อมที่จะทำให้การเปลี่ยนผ่านกลับมาอีกครั้ง นอกจากนี้คุณยังสามารถใช้การดำเนินการเชิงสัมพันธ์ร่วมกับการเข้าถึง MyISAM สไตล์ NoSQL BTW InnoDB ยังอนุญาตให้ HANDLER เข้าถึงข้อมูล
RolandoMySQLDBA

สวัสดี @RolandoMySQLDBA ฉันกำลังมองหาข้อมูลเพิ่มเติมเกี่ยวกับHANDLERโครงสร้างและความสามารถหน้า man ที่ mysql เป็นหน้าเดียวที่ฉันสามารถค้นหาได้และไม่มีอะไรมาก ... ฉันถามสิ่งนี้ว่า คำถามใหม่ที่นี่: dba.stackexchange.com/q/253653/23271และหวังว่าคุณจะรู้ทรัพยากรเพิ่มเติมหรือไม่
oucil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.