SQLite สามารถปรับขนาดได้อย่างไร [ปิด]


178

ฉันเพิ่งอ่านคำถามเกี่ยวกับSQLite VS MySQLและคำตอบที่ชี้ให้เห็นว่าข้อมูล SQLite ไม่ได้ระดับดีและเว็บไซต์อย่างเป็นทางการจัดเรียงของยืนยันนี้อย่างไร

SQLite สามารถปรับขนาดได้และข้อ จำกัด สูงสุดของมันคืออะไร?

คำตอบ:


429

เมื่อวานนี้ฉันเปิดตัวเว็บไซต์เล็ก ๆ*เพื่อติดตามตัวแทนของคุณที่ใช้ฐานข้อมูล SQLite ที่ใช้ร่วมกันสำหรับผู้เยี่ยมชมทั้งหมด แต่น่าเสียดายที่แม้จะมีการโหลดเล็กน้อยที่โฮสต์ของฉันก็ทำงานค่อนข้างช้า นี่เป็นเพราะฐานข้อมูลทั้งหมดถูกล็อคทุกครั้งที่มีคนดูหน้าเว็บเพราะมีการอัพเดท / แทรก ในไม่ช้าฉันก็เปลี่ยนไปใช้ MySQL และในขณะที่ฉันไม่มีเวลามากที่จะทดสอบดูเหมือนว่าสามารถปรับขนาดได้มากกว่า SQLite ฉันจำการโหลดหน้าเว็บช้าและในบางครั้งอาจเกิดข้อผิดพลาดในการล็อกฐานข้อมูลเมื่อพยายามเรียกใช้แบบสอบถามจากเชลล์ใน sqlite ที่กล่าวว่าฉันใช้เว็บไซต์อื่นจาก SQLite ได้ดี ข้อแตกต่างคือไซต์นั้นเป็นแบบสแตติก (เช่นฉันเป็นเพียงคนเดียวที่สามารถเปลี่ยนฐานข้อมูลได้) และทำงานได้ดีสำหรับการอ่านพร้อมกัน นิทานสอนใจ:

แก้ไข : ฉันเพิ่งรู้ว่าฉันอาจไม่ยุติธรรมกับ SQLite - ฉันไม่ได้จัดทำดัชนีคอลัมน์ใด ๆ ในฐานข้อมูล SQLite เมื่อฉันให้บริการจากหน้าเว็บ สิ่งนี้ทำให้ฉันมีอาการช้าลงบางส่วน อย่างไรก็ตามการสังเกตการล็อกฐานข้อมูลย่อมาจากถ้าคุณมีการอัพเดทที่หนักหน่วงประสิทธิภาพของ SQLite จะไม่ตรงกับ MySQL หรือ Postgres

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

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

* ไซต์นี้ไม่สามารถใช้งานได้อีกต่อไป


3
เอ็นจิ้นฐานข้อมูล "คลาสสิค" ของ MySQL MyISAM มีปัญหาแบบเดียวกันกับการดำเนินการอ่าน / เขียนพร้อมกันเป็น SQLite ในความเป็นจริงมันล็อคทุก ๆ แถวที่สัมผัสกับการดำเนินการเขียนทำให้ไม่สามารถขยายแอปพลิเคชันที่เน้นการเขียนได้ ถึงกระนั้นก็ให้บริการเว็บแอปพลิเคชั่นมากมายที่ใช้ได้
Henning

1
คุณช่วยเขียนคำตอบของคุณใหม่ได้ไหม? การตัดสินประสิทธิภาพของ DB โดยไม่มีดัชนีที่เหมาะสมนั้นไม่ยุติธรรมอย่างสมบูรณ์ นอกจากนี้การทำธุรกรรมเปลี่ยนประสิทธิภาพและความยืดหยุ่นของ SQLite เป็นจำนวนมาก
Kornel

3
@porneL: จริง แต่ SQLite ที่ไม่มีดัชนีนั้นเป็นลำดับที่มีขนาดช้ากว่า MySQL ที่ไม่มีดัชนีและฉันก็รวมบิตเกี่ยวกับธุรกรรมในการแก้ไขครั้งที่สองของฉันด้วย ฉันยังคิดว่าความก้าวหน้าของคำตอบนั้นสมเหตุสมผล - มันแสดงให้เห็นว่าฉันใช้ SQLite ที่ไร้เดียงสาในตอนแรกและประสิทธิภาพค่อนข้างแย่เพียงใด ฉันคาดหวังว่าผู้ที่มาใหม่บนแพลตฟอร์มจะพบปัญหาที่คล้ายกันและฉันหวังว่าพวกเขาสามารถระบุได้ในย่อหน้าแรกจากนั้นอ่านการแก้ไขต่อไปนี้และตระหนักว่ามีวิธีเร่ง SQLite ให้มีประสิทธิภาพที่ยอมรับได้
Kyle Cronin

1
คุณช่วยแบ่งปันกับเราประมาณว่ามีเว็บไซต์ที่คุณได้รับต่อวินาที
NoobOverflow

2
นอกจากนี้ยังมีการบันทึกล่วงหน้า (WAL) ในเวอร์ชัน SQLite ที่ใหม่กว่าซึ่งอาจทำให้ความเจ็บปวดของวงจรการอ่าน / เขียนลดลง สิ่งต่าง ๆ เปลี่ยนไป
Lasse V. Karlsen

58

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

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

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

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

แต่แน่นอนว่า Sqlite จะทำงานในสภาพแวดล้อมที่มีผู้ใช้หลายคน แต่มันจะทำงานได้ไม่ดี


5
SQLite 3 รองรับการอ่านเมื่อผู้ใช้รายอื่นเขียนถึงมัน
Alix Axel

2
โปรดทราบว่าความคิดเห็นข้างต้นล้าสมัยแล้วด้วยระบบ WAL ใหม่ (er) การเขียนและอ่านสามารถทำได้ในเวลาเดียวกันเพิ่มความยืดหยุ่น
Lasse V. Karlsen

เป็นไปได้หรือไม่ที่จะสร้างเพื่อส่งออกเรกคอร์ดในทันทีไปยัง sqlite จาก rdbms ใด ๆ เช่นเซิร์ฟเวอร์ sql หรือ oracle เป็นต้น?
ILoveStackoverflow

29

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

ถ้าคุณต้องการเพิ่มความเร็วของ SQLite ให้ทำสิ่งต่อไปนี้:

  • อัปเกรดเป็น SQLite 3.7.x
  • เปิดใช้งานการบันทึกล่วงหน้า
  • เรียกใช้ pragma ต่อไปนี้: "PRAGMA cache_size = จำนวนหน้า;" ขนาดเริ่มต้น (จำนวนหน้า) คือ 2000 หน้า แต่ถ้าคุณเพิ่มจำนวนนั้นคุณจะเพิ่มจำนวนข้อมูลที่ใช้หน่วยความจำไม่ตรง

คุณอาจต้องการดูวิดีโอของฉันบน YouTube ที่เรียกว่า " ปรับปรุงประสิทธิภาพของ SQLite ด้วยการบันทึกการเขียน Writeahead " ซึ่งแสดงวิธีการใช้การบันทึกล่วงหน้าและแสดงการปรับปรุงความเร็ว 5 เท่าสำหรับการเขียน


24

Sqlite เป็นฐานข้อมูลเดสก์ท็อปหรือในกระบวนการ SQL Server, MySQL, Oracle, และพี่น้องของพวกเขามีเซิร์ฟเวอร์

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


5
ฉันไม่เห็นด้วยกับ 'สิ่งนี้รวมถึงทุกเว็บไซต์ที่เคยสร้างมา' คิดเห็น หากเว็บไซต์โหลดสูงคุณถูกต้อง ตัวอย่างเช่น Trac ใช้ SQLite เป็นค่าเริ่มต้นและทำออกมาได้ดีมากสำหรับทีมเล็ก ๆ
Andrew Burns

2
ให้เวลา: คุณจะมีนักพัฒนาสองคนเข้าถึงฟิลด์เดียวกันในเวลาเดียวกันและมันจะทำให้หายใจไม่ออก
Joel Coehoorn

3
คุณนิยามว่าอะไรทำให้หายใจไม่ออก? จากคำตอบของคุณฉันคาดเดาว่าคุณไม่มีประสบการณ์มากกับ SQLite SQLite จะล็อกไฟล์ทั้งหมดในการดำเนินการดังนั้นคุณอาจมีความล่าช้า แต่มันเป็นไปไม่ได้เลยที่จะทำให้มัน 'หายใจไม่ออก' ในสถานการณ์ที่คุณเสนอ
Andrew Burns

3
แอนดรูว์เนื่องจาก SQL Lite ทำงานได้ดีสำหรับทีมขนาดเล็กไม่สามารถปรับขนาดได้เพื่อปรับขนาดข้อกำหนดได้ดีซึ่งหมายความว่าควรทำงานได้ดีกับทีมขนาดใหญ่ ตามความรู้ของฉัน SQL Lite ไม่สามารถปรับขนาดให้กับทีมใหญ่ / การดำเนินการฐานข้อมูลพร้อมกันที่เกินขีด จำกัด ที่ค่อนข้างต่ำ
Pop Catalin

5
@Justice คำตอบนี้ไม่มีหลักฐานสนับสนุนว่า SQLite สามารถปรับขนาดได้อย่างไร คำตอบโดยไม่มีใครดีกว่ามาก
GateKiller

23

คุณอ่านเอกสาร SQLite นี้แล้วหรือยัง- http://www.sqlite.org/whentouse.html

SQLite จะทำงานได้ดีในฐานะเครื่องมือฐานข้อมูลสำหรับเว็บไซต์ที่มีปริมาณการใช้งานต่ำถึงปานกลาง (กล่าวคือ 99.9% ของเว็บไซต์ทั้งหมด) ปริมาณการเข้าชมเว็บที่ SQLite สามารถจัดการได้นั้นขึ้นอยู่กับจำนวนเว็บไซต์ที่ใช้ฐานข้อมูล โดยทั่วไปไซต์ที่ได้รับยอดฮิตน้อยกว่า 100K / วันควรทำงานได้ดีกับ SQLite จำนวนผู้ชม 100K / วันเป็นการประมาณการแบบอนุรักษ์นิยมไม่ใช่ขอบเขตที่ยาก SQLite ได้รับการพิสูจน์แล้วว่าสามารถทำงานได้กับปริมาณการรับส่งข้อมูลถึง 10 เท่า


3
ฉันเห็นด้วยกับสิ่งนี้มาก 99% ของเว็บไซต์สามารถจัดการได้ดีกับ SQLLite ถ้าคุณต้องการ แต่ 99% ของการเข้าชมเว็บไปที่ 1% ที่ใหญ่ที่สุดของเว็บไซต์ในทางกลับกัน
djangofan

7
ตัวชี้วัดของ "100k hits / day" เป็นขยะที่สุด โดยทั่วไปคำว่า "Hit" จะถูกกำหนดเป็น HTTP GET และเว็บไซต์ที่มีรูปภาพที่แบ่งเป็นส่วน ๆ อาจมี 40 ครั้ง "Hit" ต่อการดูหน้าเว็บโดยที่ไม่มีการแตะ DB แม้ว่าเอกสารกำลังทำผิดพลาดจากการเข้าชม == มันก็ยังทำให้เข้าใจผิด SQLite ล็อค DB ทั้งหมดในการเขียน ในขณะที่มันอาจให้บริการจำนวนหน้าที่มีการเปิดดู 100k ของผู้คนเพียงแค่เรียกดูบันทึก แต่มันก็จะพังทลายลงในแอปพลิเคชันที่เน้นการเขียน (e-commerce กระดานข้อความ ฯลฯ )
jamieb

10

ความยืดหยุ่นของ SQLite นั้นขึ้นอยู่กับข้อมูลที่ใช้และรูปแบบของมัน ฉันมีประสบการณ์ที่ยากลำบากกับตารางที่ยาวเป็นพิเศษ (ระเบียน GPS หนึ่งระเบียนต่อวินาที) ประสบการณ์แสดงให้เห็นว่า SQLite จะชะลอตัวลงในขั้นตอนส่วนหนึ่งเนื่องมาจากการปรับสมดุลของต้นไม้ไบนารีที่เติบโตขึ้นเรื่อย ๆ ที่ถือดัชนี (และด้วยดัชนีที่มีการประทับเวลาคุณเพิ่งรู้ว่าต้นไม้จะได้รับการปรับสมดุลจำนวนมาก การค้นหา) ดังนั้นในที่สุดที่ประมาณ 1GB (ballpark มากฉันรู้) แบบสอบถามกลายเป็นซบเซาในกรณีของฉัน ไมล์สะสมของคุณจะแตกต่างกันไป

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

อีกวิธีในการดู SQLite คือ: SQLite ไม่ได้ออกแบบมาเพื่อแทนที่ Oracle มันถูกออกแบบมาเพื่อแทนที่ fopen ()

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


1
คุณสามารถแก้ไขปัญหาการมีตารางที่มีดัชนีที่มีขนาดใหญ่มากโดยการตัดข้อมูลของคุณเช่นหนึ่งตารางต่อวัน / สัปดาห์ SQLite ยังช่วยให้คุณสามารถแยกตารางออกเป็นไฟล์ฐานข้อมูลที่แตกต่างกันและใช้ATTACH DATABASEเพื่อสร้างการเชื่อมต่อฐานข้อมูลเสมือนกับทุกตาราง (ฮาร์ด จำกัด เพียง 62 ฐานข้อมูล)
Alix Axel

3

ฉันคิดว่าเว็บเซิร์ฟเวอร์ (ในหมายเลข 1) ที่ให้บริการลูกค้าของผู้ล่าปรากฏบนแบ็กเอนด์ด้วยการเชื่อมต่อกับฐานข้อมูลเดียวใช่ไหม

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


1
ขอบคุณ GateKiller แต่โปรดระบุ "เว็บไซต์ปริมาณน้อย"
Ice

3

คิดแบบนี้ SQL Lite จะถูกล็อคทุกครั้งที่มีคนใช้งาน (SQLite ไม่ล็อคการอ่าน) ดังนั้นหากคุณแสดงหน้าเว็บหรือแอปพลิเคชันที่มีผู้ใช้หลายคนในเวลาเดียวกันสามารถใช้แอปของคุณพร้อมกับ SQLLite ได้ ดังนั้นมีปัญหาการปรับขนาด หากแอปพลิเคชั่นคนเดียวพูดถึงคลังเพลงที่คุณมีชื่อหลายร้อยรายการ, คะแนน, ข้อมูล, การใช้, การเล่นและเวลาในการเล่น SQL Lite จะปรับสัดส่วนการถือครองได้อย่างสวยงามหากไม่นับล้านระเบียน (ฮาร์ดไดรฟ์เต็มใจ)

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

ดังนั้นในทางทฤษฎีแล้ว MySQL ปรับขนาดได้ดีกว่า Sqllite ทำให้มันสามารถจัดการกับผู้ใช้หลายคนได้ แต่เป็นการ overkill สำหรับแอพผู้ใช้คนเดียว


5
s / ใช้มัน / เขียนถึงมัน sqlite ไม่ล็อคอ่าน
เกร็กลินด์

5
ดีคำตอบของคุณสามารถตีความได้อย่างง่ายดาย ล็อค SQLite ในการร้องขอการเขียนเท่านั้น เรากำลังใช้ SQLite สำหรับด้วยข้อมูลทางการแพทย์มากกว่า 50GB ในรูปแบบเชิงสัมพันธ์และให้บริการลูกค้าเว็บหลายร้อยพร้อมกันสำหรับการเรียกดูและค้นหา ประสิทธิภาพในการอ่านไม่เคยแย่กว่า MySQL รุ่นล่าสุด
Berk D. Demir

3
MyISAM ของ MySQL นั้นไม่ดีกว่าสำหรับการเข้าถึงพร้อมกันมากกว่า SQLite MySQL ใช้การล็อกระดับตารางมากและจะไม่ทำการเขียนพร้อมกันยกเว้นในบางกรณีที่เค้าโครงของ MyISAM เหมาะสมที่สุด ถ้าคุณไม่ใช้ InnoDB (ซึ่งมีปัญหาของตัวเองเช่นดาต้าไฟล์ที่ไม่หดตัว) คุณอาจจะไม่เก่งไปกว่า MySQL อีกแล้ว
Kornel

1

เว็บไซต์ของ SQLite (ส่วนที่คุณอ้างอิง) ระบุว่าสามารถใช้กับสถานการณ์ที่มีผู้ใช้หลายคนได้หลากหลาย

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


และใช้ธุรกรรม นั่นเป็นสิ่งสำคัญสำหรับ SQLite
Kornel

-1

มันอาจคุ้มค่าที่จะลองใช้REAL SQL Serverซึ่งเป็นเซิร์ฟเวอร์ฐานข้อมูลที่สร้างขึ้นบน SQLite


7
ฉันไม่คิดว่าจะรับประกันว่าไซต์ใด ๆ ที่ใช้จ่าย $ 299 สำหรับ "REAL SQL Server" เมื่อไซต์ส่วนใหญ่ไม่ได้รับปริมาณการใช้ข้อมูลเพียงพอที่จะเริ่มต้นถึงขีด จำกัด ของ SQLLite
djangofan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.