ฉันเพิ่งตั้งค่าระบบบันทึกซึ่งประกอบด้วยหลายตารางที่มีเค้าโครงเดียวกัน
มีตารางหนึ่งตารางสำหรับแหล่งข้อมูลแต่ละแหล่ง
สำหรับโปรแกรมดูบันทึกฉันต้องการ
- ยูเนี่ยนทุกตารางบันทึก ,
- กรองพวกเขาโดยการบัญชี ,
- เพิ่มคอลัมน์หลอกสำหรับการระบุแหล่งที่มา
- เรียงพวกเขาโดยเวลา ,
- และจำกัด พวกเขาสำหรับการแบ่งหน้า
ตารางทั้งหมดมีเขตข้อมูลที่เรียกzeitpunkt
ว่าเป็นคอลัมน์วันที่ / เวลาที่จัดทำดัชนี
ความพยายามครั้งแรกของฉันคือ:
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit,
'hp' AS source FROM is_log AS l WHERE l.account_id = 730)
UNION
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt,
'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730)
ORDER BY zeit DESC LIMIT 10;
เพิ่มประสิทธิภาพไม่สามารถใช้ดัชนีที่นี่เพราะแถวทั้งหมดจากตารางทั้งสองจะถูกส่งกลับโดย subqueries UNION
และเรียงหลังจากที่
วิธีแก้ปัญหาของฉันคือต่อไปนี้:
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit,
'hp' AS source FROM is_log AS l WHERE l.account_id = 730
ORDER BY l.zeitpunkt DESC LIMIT 10)
UNION
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt,
'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730
ORDER BY l.zeitpunkt DESC LIMIT 10)
ORDER BY zeit DESC LIMIT 10;
ฉันคาดหวังว่าเคียวรีเอ็นจินจะใช้ดัชนีที่นี่เนื่องจากเคียวรีย่อยทั้งคู่ควรเรียงลำดับและ จำกัด ไว้ก่อนหน้าUNION
จากนั้นจึงผสานและเรียงลำดับแถว
ฉันคิดว่ามันจะเป็นอย่างนั้น แต่การเรียกใช้EXPLAIN
แบบสอบถามจะบอกฉันว่าแบบสอบถามย่อยยังคงค้นหาทั้งสองตาราง
EXPLAINing
แบบสอบถามย่อยเองแสดงให้ฉันเห็นการเพิ่มประสิทธิภาพที่ต้องการ แต่UNIONing
พวกเขาร่วมกันมันไม่ได้
ฉันพลาดอะไรไปหรือเปล่า?
ฉันรู้ว่าORDER BY
คำสั่งย่อยภายในUNION
เคียวรีย่อยถูกละเว้นโดยไม่มีLIMIT
แต่มีข้อ จำกัด
แก้ไข: ที่
จริงแล้วอาจมีข้อความค้นหาโดยไม่มีaccount_id
เงื่อนไข
ตารางมีอยู่แล้วและเต็มไปด้วยข้อมูล อาจมีการเปลี่ยนแปลงในเค้าโครงขึ้นอยู่กับแหล่งที่มาดังนั้นฉันต้องการให้พวกเขาแบ่งออก นอกจากนี้ไคลเอนต์การบันทึกใช้ข้อมูลประจำตัวที่แตกต่างกันด้วยเหตุผล
ฉันต้องเก็บเลเยอร์ไว้ระหว่างตัวอ่านบันทึกและตารางจริง
ต่อไปนี้เป็นแผนการดำเนินการสำหรับเคียวรีทั้งหมดและเคียวรีย่อยแรกรวมถึงโครงร่างตารางโดยละเอียด:
UNION DISTINCT
ล่ะ? ไม่จำเป็นต้องบังคับให้มีการเรียงลำดับและแตกต่างกันเนื่องจากผลลัพธ์จะแตกต่างกันไปตามเคียวรีย่อยเนื่องจากคอลัมน์การระบุพิเศษ UNION ALL
ใช้
source
คอลัมน์? วิธีนี้คุณสามารถหลีกเลี่ยงUNION
และใช้ดัชนี (s) ในข้อมูลทั้งหมดของคุณ
UNION ALL
ให้ได้แผนการปฏิบัติที่แตกต่างกันหรือไม่
(account_id, zeitpunkt)
ดัชนีดีที่สุดสำหรับการนี้จะเป็นสารประกอบ คุณมีดัชนีเช่นนี้หรือไม่? ที่ดีที่สุดที่สองจะเป็น (ฉันคิดว่า) เดียว(zeitpunkt)
- แต่ประสิทธิภาพหากมีการใช้ขึ้นอยู่กับความถี่ที่account_id=730
ปรากฏขึ้น