อัปเดตตาราง MySQL หนึ่งตารางด้วยค่าจากตารางอื่น


94

ฉันกำลังพยายามอัปเดตตาราง MySQL โดยอิงจากข้อมูลอื่น

originalตารางของฉันดูเหมือนว่า:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

และtobeupdatedตารางดูเหมือนว่า:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

ฉันต้องการที่จะปรับปรุงidในtobeupdatedกับidจากoriginalบนพื้นฐานvalue(สตริงเก็บไว้ในVARCHAR(32)เขต)

หวังว่าตารางที่อัปเดตจะมีลักษณะดังนี้:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

ฉันมีข้อความค้นหาที่ใช้งานได้ แต่ช้ามาก:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

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

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

ฉันลองMySQL - ฉันจะอัปเดตตารางด้วยค่าจากตารางอื่นได้อย่างไร แต่มันไม่ได้ช่วยจริงๆ ความคิดใด ๆ ?

ขอบคุณล่วงหน้าสำหรับการช่วยเหลือมือใหม่ MySQL!


2
คอลัมน์ 'ค่า' ของคุณมีดัชนีหรือไม่?
นู๊ดลิน

สวัสดีคุณนู๊ด; ไม่ไม่มีvalueดัชนีในขณะนี้
Superangel

คำตอบ:


211
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

นั่นควรทำและมันทำในสิ่งที่คุณเป็นจริงๆ อย่างไรก็ตามฉันชอบไวยากรณ์ 'JOIN' สำหรับการรวมมากกว่าหลาย ๆ เงื่อนไข 'WHERE' ฉันคิดว่ามันง่ายต่อการอ่าน

สำหรับการวิ่งช้าตารางใหญ่แค่ไหน? คุณควรมีดัชนีtobeupdated.valueและoriginal.value

แก้ไข: เรายังสามารถลดความซับซ้อนของแบบสอบถาม

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USINGคือชวเลขเมื่อทั้งสองโต๊ะเข้าร่วมมีเหมือนกันชื่อเช่นkey idเช่น equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join


3
ขอบคุณไวร์ 00! นี้ทำงานได้อย่างสมบูรณ์ ตารางมีขนาดค่อนข้างใหญ่ ( originalคือ 100,000+ รายการและtobeupdated10,000+) ดังนั้นฉันจึงรับคำแนะนำของคุณและคุณ ไม่อยากจะเชื่อความแตกต่าง!? ขอบคุณมากสำหรับความช่วยเหลือ; ฉันได้เรียนรู้มากมาย!
Superangel

5
เยี่ยมมากที่ได้ฟัง :) ฉันได้เรียนรู้มากมายที่นี่เช่นกัน ฉันชอบไซต์นี้มากเพราะคุณสามารถสัมผัสกับปัญหาและความคิดต่างๆมากมาย
สาย 00

ขอบคุณ .. ฉันลองหลาย ๆ อย่างจาก stackoverflow .. อันนี้ใช้ได้ในที่สุด
Jaxx0rr

แค่อยากจะบอกว่าการอัปเดตแบบธรรมดากับ WHERE นั้นเร็วกว่าไวยากรณ์ JOIN มาก ประมาณ 10.000 แถว
Alex2php

1
ส่วนประกอบสำคัญคือการกำหนดเป็นดัชนี ทำให้ฉันอัปเดตระเบียน 300K ใน 4 วินาทีเมื่อเทียบกับการหมดเวลาโดยไม่มีพวกเขา
Amjo

0

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


ขอบคุณ firegnom; ฉันไม่เคยใช้ทริกเกอร์มาก่อน แต่ฉันจะอ่านมันให้จบ
Superangel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.