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


44

ฉันกำลังทำงานกับฐานข้อมูล SQL อยู่ในขณะนี้และสิ่งนี้ทำให้ฉันสงสัยอยู่เสมอ แต่การค้นหาของ Google ไม่ได้เกิดอะไรขึ้น: ทำไมประเภทข้อมูลที่เข้มงวด

ฉันเข้าใจว่าทำไมคุณต้องการมีไม่กี่ชนิดข้อมูลที่แตกต่างกันตัวอย่างเช่นวิธีการแตกต่างระหว่างข้อมูลที่เป็นข้อความธรรมดาไบนารีและเป็นสิ่งสำคัญ แทนที่จะเก็บข้อมูลไบนารี 1 และ 0s เป็นข้อความธรรมดาตอนนี้ฉันเข้าใจว่ามันมีประสิทธิภาพมากกว่าในการจัดเก็บข้อมูลไบนารีเป็นรูปแบบของตัวเอง

แต่สิ่งที่ฉันไม่เข้าใจคือสิ่งที่ประโยชน์คือการมีประเภทข้อมูลที่แตกต่างกันมากมาย :

  • ทำไมmediumtext, longtextและtext?
  • ทำไมdecimal, floatและint?
  • เป็นต้น

ประโยชน์ของการบอกฐานข้อมูลคืออะไร "จะมีเพียง 256 ไบต์ของข้อมูลข้อความธรรมดาในรายการในคอลัมน์นี้" หรือ "คอลัมน์นี้สามารถมีรายการข้อความได้ถึง 16,777,215 ไบต์"

มันเป็นผลประโยชน์ด้านประสิทธิภาพหรือไม่? ถ้าใช่ทำไมรู้ขนาดของรายการก่อนมือช่วยประสิทธิภาพ? หรือค่อนข้างเป็นอย่างอื่นทั้งหมด?


2
ฉันคิดว่าคำถามนี้ควรมีอยู่แล้วที่นี่ แต่ฉันค้นหาเว็บไซต์และไม่พบว่ามีประโยชน์อะไร
john doe

1
มีความเกี่ยวข้องมาก: joelonsoftware.com/2001/12/11/back-to-basics
8bittree

6
หากคุณไม่ได้มีความแตกต่างกันdecimal, floatและintประเภทสิ่งที่คุณจะคาดหวังว่า1 / 3จะทำอย่างไร? เกี่ยวกับ1.0 / 3.0อะไร คุณมั่นใจไหมว่าเมื่อคุณหารcolumnAด้วยcolumnBสิ่งนั้นคุณจะได้ผลลัพธ์ที่คุณคาดหวัง?
Andrew Piliser

2
@ johndoe ฉันไม่คิดว่ามันจะจำเป็น แต่มันสะดวกมาก สมมติว่าคุณต้องการบังคับใช้ข้อ จำกัด ว่าสินค้าคงคลังของร้านค้าต้องไม่ต่ำกว่า 5% ของยอดขายรายเดือนที่คาดหวัง หรือคุณต้องการตรวจสอบให้แน่ใจว่างบประมาณรวมของแต่ละแผนกนั้นไม่เกิน 20% ของงบประมาณทั้งหมด มันอาจเกิดขึ้นในคอลัมน์จากการคำนวณที่คุณต้องการคำนวณแบบเดียวกันในหลาย ๆ แอปพลิเคชันโดยใช้ฐานข้อมูลเดียวกัน
Andrew Piliser

2
เป็นที่น่าสังเกตว่า SQLite ไม่ได้ ตั้งค่าชนิดที่กำหนดไว้ล่วงหน้าต่อคอลัมน์ : "SQLite คือ" typeless "ซึ่งหมายความว่าคุณสามารถจัดเก็บข้อมูลประเภทใดก็ได้ที่คุณต้องการในคอลัมน์ใด ๆ ของตารางใด ๆ โดยไม่คำนึงถึงประเภทข้อมูลที่ประกาศของคอลัมน์นั้น "
นายกรัฐมนตรี

คำตอบ:


50

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

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

  • ดัชนีที่ใช้สำหรับเข้าถึงระเบียนที่ระบุอย่างรวดเร็วทำงานได้ดีจริง ๆ เมื่อขนาดถูกแก้ไข ลองพิจารณาแบบสอบถามที่ใช้ดัชนีซึ่งอาจมีหลายเขตข้อมูล: หากทราบชนิดและขนาดข้อมูลล่วงหน้าฉันสามารถเปรียบเทียบภาคแสดงของฉันได้อย่างรวดเร็ว (WHERE clause หรือเกณฑ์ JOIN) กับค่าในดัชนีและค้นหาระเบียนที่ต้องการได้เร็วขึ้น .

  • พิจารณาค่าจำนวนเต็มสองค่า ในระบบชนิดไดนามิกพวกเขาอาจมีขนาดตัวแปร (คิดว่า Java BigIntegerหรือจำนวนเต็มความแม่นยำโดยพลการของ Python) ถ้าฉันต้องการเปรียบเทียบจำนวนเต็มฉันต้องรู้ความยาวบิตก่อน นี่คือแง่มุมของการเปรียบเทียบจำนวนเต็มที่ซ่อนอยู่ส่วนใหญ่โดยภาษาที่ทันสมัย ​​แต่จริงในระดับ CPU หากขนาดได้รับการแก้ไขและทราบล่วงหน้าเวลาขั้นตอนทั้งหมดจะถูกลบออกจากกระบวนการ อีกครั้งฐานข้อมูลควรจะสามารถประมวลผลการทำธุรกรรมได้อย่างรวดเร็วที่สุด ความเร็วเป็นราชา

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

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

  • ในปัจจุบันมีการใช้ SQL เพื่อเชื่อมต่อกับภาษาอื่นผ่านORMหรือODBCหรือเลเยอร์อื่น ๆ ภาษาเหล่านี้บางส่วนมีกฎเกณฑ์เกี่ยวกับการกำหนดประเภทที่เข้มงวด เป็นการดีที่สุดที่จะปฏิบัติตามข้อกำหนดที่เข้มงวดมากขึ้นเนื่องจากภาษาที่พิมพ์แบบไดนามิกสามารถจัดการกับประเภทคงที่ได้ง่ายกว่าวิธีอื่น ๆ

  • SQL รองรับการพิมพ์แบบคงที่เพราะเอ็นจินฐานข้อมูลต้องการประสิทธิภาพดังที่แสดงด้านบน

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


SQLite มีประเภทข้อมูลที่แยกความแตกต่างระหว่างข้อมูลตัวเลขและข้อความ แต่มี 5 "คลาส" ของการจัดเก็บข้อมูล: sqlite.org/datatype3.html
FrustratedWithFormsDesigner

1
@ FrustratedWithFormsDesigner ฉันรู้ แต่ก็ยังไม่มีที่ไหนใกล้เคียงที่เข้มงวดเท่ากับเอ็นจิ้นอย่าง SQL Server, Oracle หรือ PostgreSQL

ไม่เพียง แต่เป็น SQL ที่พิมพ์แบบสแตติก - เนื่องจากมีข้อ จำกัด ในการตรวจสอบ แต่สนับสนุนประเภทการปรับแต่งได้อย่างมีประสิทธิภาพ
gardenhead

4
แม้ว่าโดยนัยในสัญลักษณ์แสดงหัวข้อย่อยแรกที่Indexesระบุไว้โดยทั่วไปมากขึ้น: มีชนิดข้อมูลช่วยให้เครื่องมือฐานข้อมูลเพื่อให้ความรู้สึกของข้อมูลเพื่อทำการเปรียบเทียบ (ตัวเลขที่ใหญ่กว่า / เล็กกว่าก่อนหน้า / หลังวันที่ครั้ง / ก่อน / หลังในตัวอักษร) และทำให้สามารถเรียงลำดับและสอบถามได้
Basil Bourque

ดังนั้นหากขนาดมีความสำคัญ ... และ sql จำเป็นต้องทราบล่วงหน้า ... ขนาดที่แน่นอนของธุรกรรม "Zillion" คืออะไร
WernerCD

24

ครั้งแรก: ข้อความธรรมดาเป็นเลขฐานสอง (ไม่ใช่แม้แต่ตัวอักษร UTF8 หรือ ASCII "0" และ "1" แต่เป็นบิตเปิด / ปิดจริง)

ที่กล่าวมาบางเหตุผลคือ:

  • ข้อ จำกัด ทางธุรกิจ / การออกแบบ: การอนุญาตให้หมายเลข 7626355112 ในคอลัมน์ HEIGHT ของตาราง PERSON อาจผิด การอนุญาตให้ "Howya" ในคอลัมน์ DATE ของ INVOICE นั้นจะผิด
  • รหัสข้อผิดพลาดเกิดข้อผิดพลาดน้อย:คุณไม่จำเป็นต้องเขียนรหัสเพื่อให้แน่ใจว่าข้อมูลที่ดึงมาจากคอลัมน์วันที่เป็นวันที่จริง หากประเภทคอลัมน์เป็นแบบไดนามิกคุณจะต้องตรวจสอบประเภทจำนวนมากเมื่ออ่าน
  • ประสิทธิภาพการคำนวณ:หากคอลัมน์เป็นประเภท INTEGER และคุณ SUM () คอลัมน์นั้น RDBMS ไม่จำเป็นต้องใช้เลขคณิตทศนิยม
  • ประสิทธิภาพการจัดเก็บ:ระบุว่าคอลัมน์คือ VARCHAR (10) ให้ RDBMS จัดสรรพื้นที่ได้แม่นยำยิ่งขึ้น
  • Referential integrity และ unicity: PK (หรือ FKs) ของตารางไม่ควรอนุญาตให้มีการลอยเนื่องจากความเท่าเทียมกันของจุดลอยนั้นมีความยุ่งยากดังนั้นคุณต้องประกาศในรูปแบบที่ไม่ใช่แบบลอยเช่นตัวอักษรหรือจำนวนเต็ม
  • มีอยู่ RDBMSs whith แบบไดนามิกประเภท (ไม่เข้มงวด) คอลัมน์ (SQLite) มันใช้แนวคิดของ "ความสัมพันธ์ของประเภท" ในขณะที่ยังช่วยให้คุณสามารถแทรกทุกอย่างลงในคอลัมน์ใด ๆ โดยไม่ต้องบ่น มีการแลกเปลี่ยนที่ไม่ได้กล่าวถึงที่นี่ ดูคำถามนี้

8

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

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


ถ้าเพียง แต่คำตอบที่ทุกคนสามารถจะกระชับนี้และเพื่อจุด ...
คาร์เรน Ringer

6

เมื่อคอลัมน์ของฐานข้อมูลได้รับการกำหนดประเภทประเภทมักจะกำหนดตัวเองให้มีขนาดที่แน่นอนในบิต ผลที่ตามมา:

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

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


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

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

3

คุณถามว่าเพราะเหตุใด DBMS จึงมีชนิดข้อมูลคงที่

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

  2. ความสมบูรณ์และข้อ จำกัด ทำความสะอาดข้อมูลได้ง่ายขึ้นถ้ามีประเภทข้อมูลคงที่

  3. ประวัติศาสตร์ RDBMS เริ่มต้นขึ้นเมื่อคอมพิวเตอร์มี RAM ไม่กี่เมกะไบต์และที่เก็บข้อมูลขนาดเทราไบต์มีราคาแพงอย่างมาก การบันทึกหนึ่งโหลไบต์ในแต่ละแถวของตารางสามารถประหยัดได้หลายพันดอลลาร์และเวลาในสถานการณ์เหล่านั้น

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

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


3

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

ทำไมต้องเป็นข้อความขนาดกลางข้อความยาวและข้อความ

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

ทำไมทศนิยมทศนิยมและ int?

ระดับความแม่นยำที่แตกต่างกันนั้นต้องการพื้นที่เก็บข้อมูลที่แตกต่างกันและไม่ใช่ทุกการใช้งานที่ต้องการระดับความแม่นยำสูงสุด ตัวอย่างเช่นดูที่นี่: https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#SQLRF50950

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


2

ในระดับหนึ่งมันเป็นประวัติศาสตร์

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

เพิ่มดัชนีลงในไฟล์ดังกล่าวและคุณมีจุดเริ่มต้นของฐานข้อมูลเชิงสัมพันธ์

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

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


1

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

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


1

สำหรับสิ่งที่คุณทำในฐานะนักพัฒนาเว็บไซต์คุณไม่จำเป็นต้องเข้าใจสิ่งที่เกิดขึ้น "ภายใต้ประทุน" อย่างไรก็ตามมีบางครั้งที่มันช่วย

ประโยชน์ของการบอกฐานข้อมูลคืออะไร "จะมีเพียง 256 ไบต์ของข้อมูลข้อความธรรมดาในรายการในคอลัมน์นี้" หรือ "คอลัมน์นี้สามารถมีรายการข้อความได้ถึง 16,777,215 ไบต์"

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

ตามที่โจเอลพูด

ฐานข้อมูลเชิงสัมพันธ์นำไปใช้SELECT author FROM booksอย่างไร ในฐานข้อมูลเชิงสัมพันธ์ทุกแถวในตาราง (เช่นตารางหนังสือ) มีความยาวเท่ากันทุกไบต์และทุกเขตข้อมูลจะมีการชดเชยคงที่เสมอตั้งแต่ต้นแถว ตัวอย่างเช่นถ้าแต่ละระเบียนในตารางหนังสือมีความยาว 100 ไบต์และเขตข้อมูลผู้แต่งอยู่ที่ 23 ตรงข้ามจึงมีผู้แต่งเก็บไว้ที่ไบต์ 23, 123, 223, 323 เป็นต้นรหัสจะย้ายไปที่อะไร ระเบียนถัดไปในผลลัพธ์ของแบบสอบถามนี้ โดยทั่วไปมันคือ:

pointer += 100;

คำสั่ง CPU หนึ่งคำสั่ง Faaaaaaaaaast

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

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