Cập nhật một bảng MySQL với các giá trị từ một bảng khác


93

Tôi đang cố gắng cập nhật một bảng MySQL dựa trên thông tin từ một bảng khác.

originalBảng của tôi trông giống như:

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

tobeupdatedbảng có dạng như sau:

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

Tôi muốn cập nhật idtrong tobeupdatedvới idtừ originaldựa trên value(chuỗi lưu trữ trong VARCHAR(32)trường).

Bảng được cập nhật hy vọng sẽ giống như sau:

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

Tôi có một truy vấn hoạt động, nhưng nó rất chậm:

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

Điều này làm tối đa CPU của tôi và cuối cùng dẫn đến thời gian chờ chỉ với một phần nhỏ các bản cập nhật được thực hiện (có vài nghìn giá trị để khớp). Tôi biết việc đối sánh theo valuesẽ chậm, nhưng đây là dữ liệu duy nhất tôi có để khớp chúng với nhau.

Có cách nào tốt hơn để cập nhật các giá trị như thế này không? Tôi có thể tạo bảng thứ ba cho các kết quả đã hợp nhất, nếu điều đó sẽ nhanh hơn?

Tôi đã thử MySQL - Làm cách nào để cập nhật bảng với các giá trị từ bảng khác? , nhưng nó không thực sự hữu ích. Bất kỳ ý tưởng?

Cảm ơn trước vì đã giúp một người mới làm quen với MySQL!


2
Cột 'giá trị' của bạn có chỉ mục không?
Hadl

Chào bạn; không, valuekhông có chỉ mục vào lúc này.
Superangel

Câu trả lời:


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

Điều đó sẽ làm được, và nó thực sự đang làm chính xác những gì của bạn. Tuy nhiên, tôi thích cú pháp 'JOIN' cho các phép nối hơn là nhiều điều kiện 'WHERE', tôi nghĩ nó dễ đọc hơn

Còn chạy chậm thì các bàn lớn cỡ nào? Bạn nên có các chỉ mục trên tobeupdated.valueoriginal.value

CHỈNH SỬA: chúng tôi cũng có thể đơn giản hóa truy vấn

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

USINGlà viết tắt khi cả hai bảng của một phép nối có tên giống hệt nhau, keychẳng hạn như id. tức là một tham gia tương đương - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join


3
Cảm ơn wired00! Điều này hoạt động hoàn hảo. Các bảng này khá lớn (hơn original100.000 mục nhập và hơn tobeupdated10.000 mục nhập ), vì vậy tôi đã nghe lời khuyên của bạn và của bạn về các chỉ mục và toàn bộ truy vấn hiện kết thúc trong vòng chưa đầy một giây. Tôi không thể tin được sự khác biệt !? Cám ơn rất nhiều về sự giúp đỡ của bạn; Tôi đã học được rất nhiều!
Superangel

5
Thật tuyệt khi nghe :) Tôi cũng học được rất nhiều điều ở đây. Tôi thực sự thích trang web này là bạn có thể được tiếp xúc với nhiều vấn đề và ý tưởng khác nhau
wired00

cảm ơn bạn .. Tôi đã cố gắng rất nhiều điều từ stackoverflow .. cái này cuối cùng làm việc
Jaxx0rr

Chỉ muốn đề cập rằng một UPDATE đơn giản với WHERE nhanh hơn nhiều so với cú pháp JOIN. Khoảng 10.000 hàng.
Alex2php

1
Thành phần quan trọng của chúng tất nhiên được gán dưới dạng chỉ mục. đã đưa tôi cập nhật 300 nghìn bản ghi trong 4 giây so với thời gian chờ mà không có chúng.
Amjo

0

Nó phụ thuộc vào việc sử dụng các bảng đó là gì, nhưng bạn có thể cân nhắc đặt kích hoạt trên bảng gốc khi chèn và cập nhật. Khi chèn hoặc cập nhật xong, hãy cập nhật bảng thứ hai chỉ dựa trên một mục từ bảng gốc. Nó sẽ nhanh hơn.


Cảm ơn firegnom; Tôi chưa bao giờ sử dụng trình kích hoạt trước đây, nhưng tôi chắc chắn sẽ đọc kỹ về chúng.
Superangel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.