โซลูชันที่ดีสำหรับ GUID คืออะไร

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

หลังจาก Google และอ่านบล็อกบางส่วนแล้ว พวกเขาแนะนำให้แปลงจาก uuid เป็น binary(16) แต่ค่าที่แปลงแล้วไม่สามารถอ่านได้และใช้งานไม่สะดวกมาก นอกจากนี้ยังใช้งานยากในโค้ด Ruby ของฉันด้วย

มีวิธีแก้ปัญหาอื่นในการรับตัวระบุที่ไม่ซ้ำทั่วโลกใน MySQL นอกเหนือจาก uuid หรือไม่

mysql> select UNHEX(REPLACE('A4E7890F-A188-4663-89EB-176D94DF6774','-',''));
+---------------------------------------------------------------+
| UNHEX(REPLACE('A4E7890F-A188-4663-89EB-176D94DF6774','-','')) |
+---------------------------------------------------------------+
| ���Fc��m��gt                                                       |

ฉันตรวจสอบแล้วและ mongodb ก็มี ObjectId ซึ่งมีขนาดเพียง 12 ไบต์เท่านั้น เป็นไปได้ไหมที่จะใช้สิ่งนั้นในเซิร์ฟเวอร์ MySQL? ฉันจะใช้ประโยชน์จากสิ่งนั้นเพื่อใช้ใน MySQL ได้อย่างไร


person Chamnap    schedule 07.06.2012    source แหล่งที่มา
comment
ฉันขอแนะนำให้แบ่งโต๊ะใหญ่ของคุณออกเป็นโต๊ะเล็กๆ หลายโต๊ะก่อน ซึ่งจะช่วยในเรื่องการย้ายข้อมูลโดยเสียค่าใช้จ่ายเพียงความซับซ้อนของโค้ดเพียงเล็กน้อย   -  person Sergio Tulentsev    schedule 07.06.2012
comment
เป็นฐานข้อมูลสำหรับพอร์ทัล 200 แห่ง ตารางนั้นมีไว้สำหรับพอร์ทัลเหล่านั้น ถ้าฉันแยกฉันควรแบ่งออกเป็น 200 ฐานข้อมูล นั่นหมายความว่าฉันจะต้องบำรุงรักษาค่อนข้างมาก   -  person Chamnap    schedule 07.06.2012
comment
ทำไมต้อง 200 ฐานข้อมูล? คุณสามารถแบ่งพวกมันเป็นกลุ่มและสร้างตารางได้ 10-20 ตาราง (ฐานข้อมูล)   -  person Sergio Tulentsev    schedule 07.06.2012
comment
แต่ละตารางเป็นของทุกตาราง ถ้ามันต้องแยกก็แยกทั้งหมดเลยใช่ไหม?   -  person Chamnap    schedule 07.06.2012
comment
ไม่จำเป็น. คุณยังสามารถแยกออกเป็นอย่างอื่นได้ (ตารางหนึ่งกลายเป็น 10 ตาราง และอีกตารางหนึ่ง - 20)   -  person Sergio Tulentsev    schedule 07.06.2012
comment
การรายงานจะเป็นเรื่องยากเนื่องจากข้อมูลกระจัดกระจาย   -  person Chamnap    schedule 07.06.2012
comment
ใช่ แต่การย้ายข้อมูลดำเนินเร็วขึ้น และคุณสามารถแยกข้อมูลได้ตลอดเวลา (และย้ายข้อมูลไปยังเครื่องอื่น) การล้อเล่นกับรูปแบบข้อมูลมีผลน้อยกว่ามาก   -  person Sergio Tulentsev    schedule 07.06.2012


คำตอบ (1)


คำตอบ

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

  1. ใช้คอลัมน์ AUTO_INCREMENT สำหรับคีย์หลักของคุณ เนื่องจาก MySQL ได้รับการปรับให้เหมาะสมเพื่อสิ่งนั้น
  2. จัดทำดัชนีคอลัมน์ UUID ของคุณเพื่อให้คุณสามารถค้นหาได้อย่างรวดเร็วโดยไม่ต้องสแกนตารางทั้งหมด

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

คำถามที่เกี่ยวข้อง

ประสิทธิภาพของ UUID ใน MySQL?

person Todd A. Jacobs    schedule 07.06.2012
comment
การโยกย้ายของเขานั้นช้า ไม่ใช่การสืบค้น - person Sergio Tulentsev; 07.06.2012
comment
@SergioTulentsev OP บอกว่าประสิทธิภาพการสืบค้นดูเหมือนจะไม่ดีเช่นกัน โปรดเสนอคำตอบที่ดีกว่านี้หากคุณมี ฉันจะโหวตทุกสิ่งที่แก้ไขปัญหาได้ดีกว่าคำแนะนำของฉันอย่างแน่นอน - person Todd A. Jacobs; 07.06.2012
comment
ขอโทษที ฉันมันแย่ ไม่ได้สังเกตเห็นอันนั้น - person Sergio Tulentsev; 07.06.2012
comment
คำตอบของฉัน (ในความคิดเห็น) คือ: แบ่งตารางและรับเครื่องเพิ่ม แต่ฉันลังเลที่จะโพสต์มันเป็นคำตอบ :) - person Sergio Tulentsev; 07.06.2012