การลบข้อมูล mysql จำนวนมาก (4 ล้านแถว) อย่างมีประสิทธิภาพเป็นประจำ


10

เรามีตาราง mysql ที่เวลาประมาณ 12 ล้านแถว เราจำเป็นต้องลบข้อมูลเก่าเพื่อให้ขนาดของตารางค่อนข้างจัดการได้

ตอนนี้เรากำลังเรียกใช้แบบสอบถามนี้ทุกวันเวลาเที่ยงคืนโดยใช้งาน cron:

DELETE FROM table WHERE endTime < '1393632001'

ครั้งล่าสุดที่มีการเรียกใช้แบบสอบถามตรวจสอบ 4,602,400 ใช้เวลา 3 นาทีและ CPU ดำเนินการผ่านหลังคา

CPU spiking ตอนเที่ยงคืน

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

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

php  mysql 

อาจใช้งาน cron เพื่อลบทุก ๆ 10 นาทีและ 100k ต่อรอบหรือทุกๆ 5 นาที 50k ต่อรอบ

ชิ้นเล็ก ๆ เป็นประจำ?

ตกลง แต่ดูเหมือนว่ามันอาจทำลายประสบการณ์ผู้ใช้ของเราเป็นเวลานาน :) สิ่งใดที่เราสามารถทำได้แบบสอบถาม / ออกแบบฉลาด?

1
ผู้ใช้ 186k ​​คนไม่มี db คนพิเศษ?

1
คุณจะได้รับคำตอบที่ดีขึ้นเกี่ยวกับ "ผู้ดูแลฐานข้อมูล"
James Anderson

คำตอบ:


13

วิธีแก้ไขปัญหาของคุณคือความสามารถของ MySQL ที่เรียกว่า "การแบ่งพาร์ติชัน" เอกสารที่ได้คือที่นี่

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

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


ว้าวมันมีประโยชน์อย่างเหลือเชื่อและดูเหมือนว่าเป็นโซลูชั่นที่สมบูรณ์แบบ ได้เวลาอ่านการแบ่งพาร์ติชันแล้ว! ขอบคุณ!

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