2009-08-31 35 views
10

Tôi có một cơ sở dữ liệu MySQL với một bảng MyISAM với 4 triệu hàng. Tôi cập nhật bảng này khoảng một lần một tuần với khoảng 2000 hàng mới. Sau khi cập nhật, tôi sau đó thay đổi bảng như sau:MySQL ALTER TABLE trên bảng rất lớn - có an toàn để chạy không?

ALTER TABLE x ORDER BY PK DESC 

Tôi sắp xếp bảng theo trường khóa chính theo thứ tự giảm dần. Điều này đã không cho tôi bất kỳ vấn đề gì về máy phát triển của tôi (Windows với bộ nhớ 3GB). Ba lần tôi đã thử nó thành công trên máy chủ Linux sản xuất (với RAM 512MB - và đạt được bảng xếp hạng kết quả trong khoảng 6 phút mỗi lần), lần cuối tôi thử nó, tôi phải dừng truy vấn sau khoảng 30 phút và xây dựng lại cơ sở dữ liệu từ một bản sao lưu.

Máy chủ 512MB có thể đối phó với tuyên bố thay đổi đó trên bảng lớn như vậy không? Tôi đã đọc rằng một bảng tạm thời được tạo ra để thực hiện lệnh ALTER TABLE.

Câu hỏi: Lệnh này có thể được chạy an toàn không? Điều gì sẽ là thời gian dự kiến ​​cho sự thay đổi của bảng?

+1

Tôi nghĩ "Bảng rất lớn" có thể là một lời nói quá mức. 4M hàng không phải là một bảng rất lớn. 1bn có thể là. – MarkR

Trả lời

0

Tôi có thể tạo Chế độ xem thay vì được sắp xếp theo giá trị PK, để cho một thứ bạn không cần phải khóa bảng lớn đó trong khi ALTER đang được thực hiện.

+0

Cảm ơn bạn đã trả lời ... Tôi không quan tâm đến việc khóa bảng trong khi cập nhật vì nó sẽ ngoại tuyến ... –

+0

Tôi không tin một lượt xem sẽ giúp ích ở đây. MySQL có [hai chiến lược] [1] để xem các độ phân giải: 'MERGE' và' TEMPTABLE'. Khi sử dụng hợp nhất, bạn sẽ không nhận được bất kỳ lợi ích nào vì định nghĩa của nó đơn giản được kết hợp với câu lệnh 'SELECT' đã gửi. 'TEMPTABLE', như tên cho thấy, sẽ tạo ra một bảng tạm thời. Nhưng theo cách của nó, việc tạo ra bảng tạm thời là nguyên nhân của vấn đề ban đầu. Vì vậy, bạn sẽ không đạt được bất cứ điều gì ngoại trừ việc bảo trì khó khăn hơn. [1]: http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html – exhuma

3

Như tôi vừa đọc, truy vấn ALTER TABLE ... ORDER BY ... hữu ích để cải thiện hiệu suất trong một số trường hợp nhất định. Tôi ngạc nhiên rằng chỉ số PK không giúp gì cho điều này. Tuy nhiên, từ the MySQL docs, có vẻ như InnoDB hiện sử dụng chỉ mục. Tuy nhiên InnoDB có xu hướng chậm hơn như MyISAM. Điều đó nói rằng, với InnoDB bạn sẽ không cần phải sắp xếp lại bảng nhưng bạn sẽ mất tốc độ rực rỡ của MyISAM. Nó vẫn có thể đáng để bắn.

Cách bạn giải thích các sự cố, có vẻ như có quá nhiều dữ liệu được tải vào bộ nhớ (có thể thậm chí có sự hoán đổi đang xảy ra?). Bạn có thể dễ dàng kiểm tra xem có sử dụng bộ nhớ của mình hay không. Thật khó để nói như tôi không biết MySQL tất cả những gì tốt.

Mặt khác, tôi nghĩ vấn đề của bạn nằm ở một nơi rất khác: Bạn đang sử dụng một máy chỉ có 512 Megabyte RAM làm máy chủ Cơ sở dữ liệu với một bảng chứa nhiều hơn 4Mio hàng ... Và bạn đang thực hiện hoạt động rất nhiều bộ nhớ trên toàn bộ bảng trên máy đó. Dường như 512Megs sẽ không gần như đủ cho điều đó.

Một vấn đề cơ bản hơn tôi thấy ở đây: Bạn đang phát triển (và có khả năng thử nghiệm tốt) trong môi trường rất khác với môi trường sản xuất. Các loại vấn đề bạn đang giải thích là để được mong đợi. Máy phát triển của bạn có bộ nhớ gấp 6 lần so với máy sản xuất của bạn. Tôi tin rằng tôi có thể nói một cách an toàn, bộ vi xử lý cũng nhanh hơn nhiều. Trong trường hợp đó, tôi đề nghị bạn tạo một máy ảo bắt chước trang web sản xuất của bạn. Bằng cách đó bạn có thể dễ dàng kiểm tra dự án của mình mà không làm gián đoạn trang web sản xuất.

+0

Những cải tiến gần đây cho InnoDB đã làm cho nó hoạt động ngang bằng với MyISAM trong hầu hết các trường hợp. –

+0

@Bill: Thú vị. Vì vậy, với điều đó, bạn có thể nói rằng InnoDB thực sự là con đường để đi? Hiệu suất tương tự, nhiều tính năng hơn. Sau khi nhìn thấy hồ sơ của bạn, tôi nghĩ rằng tôi có thể tin bạn. Tuy nhiên, bạn có bất kỳ bằng chứng để đi với điều đó? – exhuma

0

Điều bạn đang yêu cầu làm là xây dựng lại toàn bộ bảng và tất cả các chỉ mục của bảng; đây là một hoạt động tốn kém đặc biệt nếu dữ liệu không phù hợp với ram. Nó sẽ hoàn thành, nhưng nó sẽ chậm hơn rất nhiều nếu dữ liệu không phù hợp với ram, đặc biệt nếu bạn có nhiều chỉ mục.

Tôi đặt câu hỏi về phán đoán của bạn khi chọn chạy máy có bộ nhớ nhỏ như vậy trong quá trình sản xuất. Dù sao:

  • Đây có phải là ALTER TABLE thực sự cần thiết hay không; truy vấn cụ thể nào bạn đang cố gắng tăng tốc và bạn đã thử nó chưa?
  • Bạn đã cân nhắc làm cho máy phát triển của mình giống sản xuất hơn?Tôi có nghĩa là, bằng cách sử dụng một hộp dev với bộ nhớ MORE là không bao giờ là một ý tưởng tốt, và sử dụng một hệ điều hành khác nhau chắc chắn không phải là một trong hai.

Có thể bạn cũng có thể thực hiện một số điều chỉnh để cố gắng trợ giúp; nó phần lớn phụ thuộc vào lược đồ của bạn (các chỉ mục cụ thể). 4M hàng không phải là rất nhiều (đối với một máy có số lượng ram bình thường).

+0

Hi Mark ... cảm ơn câu trả lời của bạn ... Giới hạn về bộ nhớ là do cân nhắc về ngân sách ... Tôi nghĩ rằng nếu trang web bị bắt gặp, tôi sẽ nâng cấp các thông số kỹ thuật của máy chủ ... Tuy nhiên, lý do làm ALTER là người dùng có thể chạy một thủ tục được lưu trữ truy vấn bảng này và tôi muốn trả lại kết quả theo thứ tự "mới nhất được chèn đầu tiên". Tôi có thể đạt được điều này bằng cách sử dụng ORDER BY trong truy vấn, nhưng tiếc là điều này có vẻ rất tốn kém và làm chậm các truy vấn đáng kể ... Vì vậy, khi tôi cập nhật bảng, tôi thường đặt hàng trước bởi PK desc để bỏ qua ORDER BY này. –

+0

Bạn nên tạo một chỉ mục thích hợp để truy vấn ORDER BY không cần sắp xếp. Bạn có thể kiểm tra điều này bằng cách sử dụng GIẢI THÍCH (Chỉ khi truy vấn không nằm trong SP). ALTER TABLE ... ORDER BY không phải là một giải pháp, vì nó không đảm bảo dữ liệu vẫn được đặt hàng. – MarkR

+0

Xin chào Mark. Tôi có 8 chỉ mục trên bảng này. Nếu tôi thêm trường PK (thứ mà tôi muốn sắp xếp theo thứ tự desc) vào phần ngoài cùng bên phải của mỗi chỉ mục này, các chỉ mục sẽ vẫn được sử dụng để đáp ứng mệnh đề WHERE và, mặc dù trường thứ tự sẽ không nằm ngoài cùng bên trái tiền tố của chỉ mục (vì tôi sẽ thêm nó vào tận cùng bên phải của mỗi chỉ mục), nó vẫn có thể được sử dụng cho ORDER BY? Cảm ơn. –

0

Nếu bạn đang sử dụng InnoDB, bạn không cần phải thực hiện rõ ràng ORDER BY hoặc sau khi chèn hoặc tại thời điểm truy vấn. Theo hướng dẫn MySQL 5.0, InnoDB đã mặc định để đặt hàng khóa chính cho kết quả truy vấn:

http://dev.mysql.com/doc/refman/5.0/en/alter-table.html#id4052480

bảng MyISAM trả lại hồ sơ để chèn theo mặc định, thay vào đó, có thể làm việc tốt nếu bạn chỉ từng gắn liền với các bảng, thay vì sử dụng truy vấn UPDATE để sửa đổi bất kỳ hàng nào tại chỗ.

1

là khóa chính auto_increment? nếu vậy, sau đó làm ALTER TABLE ... ORDER BY sẽ không cải thiện bất cứ điều gì vì mọi thứ sẽ được chèn vào theo thứ tự anyway.

(trừ khi bạn có nhiều lần xóa)

+0

Cảm ơn bạn đã trả lời. Tuy nhiên, vấn đề là tôi muốn đưa ra kết quả theo thứ tự ngược lại của thứ tự khóa chính ... –

+1

thì bạn cần phải tối ưu hóa các thủ tục, truy vấn và cài đặt máy chủ được lưu trữ của bạn, không thử những thứ ma thuật đen như ALTER TABLE, mà chỉ hoạt động vì một quirk trong bảng myisam. nếu hiệu suất của các thủ tục lưu trữ và truy vấn của bạn bị ảnh hưởng khi bạn sắp xếp chúng thì bạn nên mở một câu hỏi mới và đăng câu lệnh CREATE TABLE, truy vấn/thủ tục và đầu ra GIẢI THÍCH. sau đó chúng tôi có thể giúp bạn tối ưu hóa truy vấn hoặc cấu hình máy chủ của bạn. – longneck

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