จะใช้มุมมองใน MySQL เมื่อใด


54

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

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

ฉันเริ่มใช้มุมมองตามคำตอบของคำถามที่เกี่ยวข้องใน SO ( เมื่อใดที่จะใช้ R, เมื่อใดควรใช้ SQL ) คำตอบที่ได้รับการโหวตสูงสุดจะเริ่มต้น "ทำการเปลี่ยนแปลงข้อมูลใน SQL จนกว่าข้อมูลจะอยู่ในตารางเดียวแล้วทำส่วนที่เหลือใน R"

ฉันเริ่มใช้มุมมอง แต่ฉันมีปัญหาเล็กน้อยเกี่ยวกับมุมมอง:

  1. ข้อความค้นหาช้าลงมาก
  2. มุมมองไม่ได้รับการเททิ้งจากการผลิตไปยังฐานข้อมูลสำรองที่ฉันใช้สำหรับการวิเคราะห์

มุมมองที่เหมาะสมสำหรับการใช้งานนี้? ถ้าเป็นเช่นนั้นฉันควรคาดหวังว่าจะได้รับการลงโทษหรือไม่ มีวิธีเพิ่มความเร็วคิวรีในการดูหรือไม่?


ดูเหมือนว่าจะมีมุมมองที่เหมาะสมที่นี่ แต่ฉันไม่แน่ใจว่าสิ่งใดที่อาจทำให้เกิดการชะลอตัวเมื่อทำการค้นหา
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner มีการวินิจฉัยใดบ้างที่จะช่วยได้ (ย่อมาจากการสร้างตัวอย่างที่ทำซ้ำได้)? ข้อความค้นหาที่ซับซ้อนเดียวกันจะใช้เวลา <4s เมื่อเสร็จสิ้นบนตารางที่เข้าร่วมและ> 25s เมื่อดำเนินการกับมุมมองโดยตรง คาดว่าจะมีมุมมองที่ไม่มีโทษประสิทธิภาพหรือไม่?
David LeBauer

เป็นเวลานานแล้วที่ฉันใช้ MySQL ดังนั้นฉันจึงไม่สามารถพูดได้จริงๆ
FrustratedWithFormsDesigner

ผมใช้ MySQL และฉันจะบอกคุณมีมุมมองที่น่ากลัว unuseable เมื่อคุณได้รับ 100K และสูงกว่าเพียงแค่ใช้คำสั่งตรงที่คุณสามารถควบคุมสิ่งที่เขตจะกลับมาและสิ่งที่จะใช้ร่วม
สตีเฟ่น Senkomago Musoke

คำตอบ:


43

มุมมองใน MySQL ได้รับการจัดการโดยใช้หนึ่งในสองขั้นตอนวิธีการที่แตกต่างกันหรือMERGE เป็นเพียงการขยายแบบสอบถามด้วยนามแฝงที่เหมาะสม มันเป็นสิ่งที่ดูเหมือนว่ามุมมองทำให้ผลลัพธ์ลงในตารางชั่วคราวก่อนที่จะเรียกใช้คำสั่งย่อย WHERE และไม่มีดัชนีบนTEMPTABLEMERGETEMPTABLE

ตัวเลือก 'สาม' คือUNDEFINEDซึ่งบอกให้ MySQL เลือกอัลกอริทึมที่เหมาะสม MySQL จะพยายามใช้MERGEเพราะมันมีประสิทธิภาพมากกว่า ข้อแม้หลัก:

หากไม่สามารถใช้อัลกอริทึม MERGE ได้จะต้องใช้ตารางชั่วคราวแทน ไม่สามารถใช้ MERGE ได้หากมุมมองมีโครงสร้างใด ๆ ต่อไปนี้:

  • ฟังก์ชันการรวม (SUM (), MIN (), MAX (), COUNT (), และอื่น ๆ )

  • ที่แตกต่าง

  • จัดกลุ่มตาม

  • การมี

  • LIMIT

  • ยูเนี่ยนหรือยูเนี่ยนทั้งหมด

  • แบบสอบถามย่อยในรายการที่เลือก

  • อ้างถึงค่าตามตัวอักษรเท่านั้น (ในกรณีนี้ไม่มีตารางอ้างอิง)

[src]

ฉันอยากลองเดาว่ามุมมองของคุณกำลังต้องการอัลกอริทึม TEMPTABLE ทำให้เกิดปัญหาประสิทธิภาพ

นี่เป็นบล็อกโพสต์เก่า ๆเกี่ยวกับประสิทธิภาพของการดูใน MySQL และดูเหมือนว่าจะไม่ดีขึ้น

อย่างไรก็ตามอาจมีแสงสว่างในตอนท้ายของอุโมงค์เกี่ยวกับปัญหาของตารางชั่วคราวนี้ที่ไม่มีดัชนี (ก่อให้เกิดการสแกนเต็มตาราง) ใน5.6 :

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

@ypercube ชี้ให้เห็น MariaDB 5.3 ได้เพิ่มประสิทธิภาพการเพิ่มประสิทธิภาพเดียวกัน บทความนี้มีภาพรวมที่น่าสนใจของกระบวนการ:

การปรับให้เหมาะสมจะถูกนำไปใช้แล้วตารางที่ได้รับไม่สามารถรวมเข้ากับการเลือกหลักซึ่งเกิดขึ้นเมื่อตารางที่ได้รับไม่ตรงตามเกณฑ์สำหรับ VIEW ที่ผสาน


ฉันไม่ได้ทำการทดสอบการอ้างสิทธิ์เหล่านี้ แต่ MariaDB 5.3 (เพิ่งเปิดตัวในขณะที่เสถียร) มีการปรับปรุงที่สำคัญเกี่ยวกับเครื่องมือเพิ่มประสิทธิภาพรวมถึง Views :Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
ypercubeᵀᴹ

@ypercube ขอบคุณสำหรับลิงค์นั้น ... ปรากฏว่า MySQL 5.6 มีการเพิ่มประสิทธิภาพอย่างน้อยในการเพิ่มดัชนีไปยังตารางที่ได้รับ
Derek Downey

14

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

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

ในการปรับแต่งแบบสอบถามให้ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเสมอหลีกเลี่ยงการใช้ฟังก์ชั่นใน WHERE clauses สร้างดัชนีเพื่อเร่งความเร็วการเลือก

มีเอกสารที่ดีที่สามารถช่วยเหลือคุณได้: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234


5
ฉันไม่เห็นด้วยว่าการดูเป็นเครื่องมือรักษาความปลอดภัย (เท่านั้น) สามารถใช้วิธีนั้นได้ แต่เราใช้เพื่อลบความซับซ้อนในการค้นหาที่นักพัฒนารายงานของเราใช้เป็นประจำ
JHFB

2
@JHFB: ฉันเห็นด้วยกับคุณ แต่อาจเป็นเพียงวิธีการทำงานใน MySQL ที่ดูเหมือนจะได้รับการลงโทษอย่างรุนแรง?
FrustratedWithFormsDesigner

@ frustratedwithformsdesigner เป็นจุดที่ดีมาก - มันผ่านมานานแล้วตั้งแต่ฉันใช้ MySQL
JHFB

1
@JHFB มุมมองใน Mysql เป็นปัญหาใหญ่! mysqlperformanceblog.com/2007/08/12/…
Rainier Morilla

2
@RainierMorilla Views ลดประสิทธิภาพ !!
Suhail Gupta

-2

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


2
ยังไม่ชัดเจนว่าคุณกำลังพยายามทำประเด็นอะไรและวิธีการแก้ไขปัญหาที่วางไว้ในโพสต์ต้นฉบับ คุณอาจต้องการอ่านคำถามอีกครั้ง แต่ในกรณีใด ๆ โปรดพิจารณาขยายคำตอบของคุณเพื่อให้ชัดเจนยิ่งขึ้นว่าจะสามารถนำไปใช้กับปัญหาของ OP ได้อย่างไร
Andriy M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.