เข้าถึงฐานข้อมูลหลายตัวหรือเข้าถึงได้หนึ่งครั้งหรือไม่


25

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

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


คุณกำลังใช้แพลตฟอร์มใดบ้าง ถ้า LAMP u cud ใช้ memcaching
ravi404

เช่นเดียวกับการเพิ่มประสิทธิภาพการทำงานอื่น ๆ ที่คุณวัด
Telastyn

2
@Telastyn: ฉันกำลังตัดสินใจออกแบบพื้นฐานและไม่มีเซิร์ฟเวอร์เตรียมการ การเรียก db ทั้งหมดของฉันคือ aa db ที่อยู่บนเครื่องเดียวกันกับที่ใช้งาน php ฉันหวังว่าจะได้เรียนรู้จากประสบการณ์ของคนอื่นในเรื่องนี้ก่อนที่ฉันจะรู้ตัวว่าเส้นทางที่ฉันตัดสินใจใช้นั้นยอดเยี่ยมมากเมื่อทุกอย่างเป็นท้องถิ่น แต่ไม่เหมาะเมื่อถ่ายสด
DudeOnRock

1
@DudeOnRock - พยักหน้าโดยทั่วไปขึ้นอยู่กับรูปแบบการใช้งานของคุณและการเปลี่ยนแปลงของข้อมูล หากเคียวรีหนึ่งรายการให้ 80% ของสิ่งที่ผู้คนต้องการและข้อมูลไม่เปลี่ยนแปลงบ่อยนักให้ไปด้วย แคชง่ายเพิ่มประสิทธิภาพได้ง่าย หากหนึ่งแบบสอบถามส่งคืนเช่น 5% ของสิ่งที่ผู้ใช้มักจะต้องการแล้วอาจจะไม่ ฉันมีแนวโน้มที่จะค้นหามากกว่าคำถามน้อยกว่า คุณสามารถตัดออกได้ที่เซิร์ฟเวอร์ก่อนที่จะถึงฐานข้อมูล ยากที่จะเลิกทำ 'ทุกสิ่งทำให้หนึ่งคำค้นหา'
Telastyn

@ravz: ฟังดูน่าสนใจ!
DudeOnRock

คำตอบ:


27

ไม่มีคำตอบที่ถูกต้องสำหรับสิ่งนี้ เช่นการเพิ่มประสิทธิภาพใด ๆ มันขึ้นอยู่กับบริบท / การใช้งาน

อย่างไรก็ตามให้พิจารณาสิ่งต่อไปนี้เป็นกฎง่ายๆ:

x
+: Data is stable / static
-: Data is dynamic / volatile

y
+: Data is frequently used
-: Data is infrequently used

++: fetch large chunks in the fewest number of fetches 
    and persist the data as long as possible within tolerances for staleness.

+-: do what is expedient to the logic & usage; if it is convenient to 
    fetch / calc as needed do so, if it is convenient to pre-fetch and 
    persist then do so. Seek to optimize only if absolutely necessary.

-+: fetch / calc as needed; but if optimization is required consider 
    pre-fetching or pre-calculating if possible, or negotiate a tolerance 
    for less than real time accuracy to reduce volatility.

--: fetch / calc as needed and don't worry about it further unless a 
    specific case is unacceptably expensive; if so see -+.

24

อย่าลืมกฎข้อแรกของการเพิ่มประสิทธิภาพ: วัดไม่ต้องเดา ลองทั้งสองใช้เครื่องมือเหล่านี้ด้วยรหัสนาฬิกาจับเวลาและดูว่าอะไรใช้เวลานานกว่านี้

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


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

4

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

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

สิ่งที่สองคือต้องติดตามการใช้งานแอปพลิเคชัน วิธีการใช้แอปพลิเคชันของผู้ใช้ปลายทาง ตัดลงบนข้อมูลที่ส่งกลับตัวเลขดิบที่ไม่จำเป็นให้กับผู้ใช้ (s) อาจช่วยให้คุณประหยัดมากมีค่าทรัพยากรของเซิร์ฟเวอร์ ตัวอย่างเช่น: ไม่มีจุดในการส่งคืน 5,000 เรคคอร์ดในขณะที่ผู้ใช้สนใจใน 50 อันดับแรก

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


2

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


ตามความเห็นนี่เป็นการใช้ฐานข้อมูลท้องถิ่นดังนั้นจึงไม่มีความล่าช้า "over the wire" ที่นี่
Mason Wheeler

1
ตามความคิดเห็นเขากำลังมองหากลยุทธ์ที่จะไม่“ ดีเมื่อทุกอย่างเป็นท้องถิ่น แต่ย่อยดีที่สุดเมื่อถ่ายสด”
TMN

1

หากคุณตัดสินใจเกี่ยวกับสถาปัตยกรรม REST เป็นทางเลือกหนึ่ง ด้วย REST คุณมักจะร้องขอทรัพยากรหลายครั้งเช่นคุณจะไม่ส่งคำขอเพื่อรับวัตถุ 2 ชิ้นเนื่องจากแต่ละวัตถุมี URL ของตัวเอง ความกังวลเกี่ยวกับประสิทธิภาพของการทำแบบนี้อาจจะได้รับการแก้ไขเมื่อ HTTP / 2.0 ออกมา มิฉะนั้นคุณเพียงเพิ่มประสิทธิภาพเพื่อให้เร็วที่สุด หลาย บริษัท กำลังทำเช่นนี้

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