ฉันเพิ่งตั้งค่าระบบบันทึกซึ่งประกอบด้วยหลายตารางที่มีเค้าโครงเดียวกัน
มีตารางหนึ่งตารางสำหรับแหล่งข้อมูลแต่ละแหล่ง
สำหรับโปรแกรมดูบันทึกฉันต้องการ
- ยูเนี่ยนทุกตารางบันทึก ,
- กรองพวกเขาโดยการบัญชี ,
- เพิ่มคอลัมน์หลอกสำหรับการระบุแหล่งที่มา
- เรียงพวกเขาโดยเวลา ,
- และจำกัด พวกเขาสำหรับการแบ่งหน้า
ตารางทั้งหมดมีเขตข้อมูลที่เรียก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ปรากฏขึ้น