2014-11-10 17 views
7

Tôi cần cập nhật bảng ngoại trừ 1000 bản ghi hàng đầu. truy vấn của tôi là như thế này:Cập nhật MySQL sau N hàng

UPDATE tableA 
SET price = 100 
WHERE price = 200 AND 
     item_id =12 AND 
     status NOT IN (1,2,3); 

Tôi biết approcah subquery sẽ làm việc ở đây nhưng tôi đang gặp một bảng rất lớn, trong đó 200000 hồ sơ đáp ứng các điều kiện WHERE và nó đang phát triển. Vì vậy, tôi nghĩ rằng nếu tôi làm theo các phương pháp tiếp cận truy vấn phụ, nó sẽ không quy mô như DB phát triển.

Ngoài ra tôi đã thấy chỉ định LIMIT trong truy vấn UPDATE nhưng tối đa là giới hạn nhất định. Trong trường hợp của tôi nó là sau một sự bù đắp nhất định và nên cập nhật tất cả các hồ sơ.

Cũng có thể tìm tổng số và chỉ định tổng số là LIMIT. Nhưng truy vấn COUNT() không thành công.

Trả lời

0

Tôi không chắc chắn đây có phải là giải pháp đúng hay không nhưng nếu bạn có một cột ID duy nhất trong bảng của mình; ví dụ: giả sử ID, sau đó bạn có thể đặt vị từ rất dễ dàng nói WHERE ID > 1000. Mà sẽ chỉ xem xét hàng từ vị trí 1001th như

UPDATE tableA SET price = 100 
WHERE price = 200 
AND item_id = 12 
AND ID > 1000 
+0

Cảm ơn Rahul vì đã trả lời nhanh. nhưng tôi không thể dựa vào ID ở đây vì nó đang chọn cho một mục cụ thể và do đó các ID có thể không theo thứ tự. –

+1

với 'ID' có nghĩa là một cột auto_increment duy nhất giống như cột. thì giải pháp trên là giải pháp hiệu quả nhất. nếu không thì nó hơi tẻ nhạt khi nói đến tải trọng lớn. – Rahul

+0

Vâng. Tôi cũng có nghĩa là như nhau :) –

1

Bạn có thể sử dụng sử dụng biến được định nghĩa:

SET @X = (SELECT ID FROM tableA 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    ORDER BY ID LIMIT 1000,1); 
UPDATE tableA SET price = 100 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    AND ID>@X; 

Có, bạn sẽ cần một số cách làm thế nào để xác định "những gì là hàng tồn đầu tiên". Biến do người dùng xác định cung cấp cho bạn nhiều tùy chọn hơn cách thực hiện. Và nếu bạn không thể làm điều đó một cách hiệu quả trong một số truy vấn chọn, bạn sẽ cần phải suy nghĩ về một số cách làm thế nào để làm lại bảng như vậy. Có thể phương pháp lập chỉ mục khác, tách bảng, lưu vào bộ nhớ cache một số giá trị, v.v.

Các vấn đề liên quan