2012-07-01 28 views
10

Tôi nghĩ rằng tôi có một sự hiểu biết cơ bản về điều này, nhưng tôi hy vọng rằng ai đó có thể cung cấp cho tôi thêm chi tiết vì tôi quan tâm đến việc tìm hiểu thêm về hiệu suất cơ sở dữ liệu.Khi nào một truy vấn MySQL chậm trên một kết nối nhất định ảnh hưởng đến các kết nối khác?

Cho phép nói rằng tôi có cơ sở dữ liệu rất lớn, với hàng triệu mục nhập, cơ sở dữ liệu hỗ trợ nhiều kết nối. Thực hiện các truy vấn đơn giản trên cơ sở dữ liệu sẽ chậm vì có quá nhiều dữ liệu. Tôi đang cố gắng để hiểu chính xác khi một truy vấn trên một kết nối nhất định bắt đầu có ảnh hưởng trực tiếp đến hiệu suất của các truy vấn chạy trên các kết nối khác.

Nếu một kết nối khóa một số thành phần, tôi hiểu rằng sẽ giữ các truy vấn chạy các kết nối khác cần các yếu tố đó. Ví dụ: đang làm:

SELECT FOR UPDATE 

sẽ khóa những gì bạn đang chọn.

gì xảy ra khi bạn làm điều gì đó đơn giản như:

SELECT COUNT(*) FROM myTable 

phép nói rằng chúng ta có một bảng với một tỷ hàng để chạy các tính sẽ mất một thời gian (chạy trên InnoDB). Nó có ảnh hưởng đến các truy vấn chạy trên các kết nối khác không?

gì nếu bạn chọn một số lượng lớn các dữ liệu sử dụng SELECT và JOIN, như:

SELECT * FROM myTable1 JOIN myTable2 ON myTable1.id = myTable2.id; 

không có bất cứ điều gì khóa cho các truy vấn khác tham gia?

Tôi rất khó để biết truy vấn nào sẽ ảnh hưởng trực tiếp đến hiệu suất của các truy vấn chạy trên các kết nối khác.

Cảm ơn

Trả lời

4

Có góc độ khác nhau:

  • Row khóa: điều này không nên xảy ra nếu bạn điều chỉnh kiến ​​trúc của bạn, vì vậy bạn nên quên nó đi
  • vấn đề màn trình diễn Real và nút cổ chai. Trong trường hợp của chúng tôi, các hiệu ứng tài sản thế chấp.

Về điểm thứ hai này, vấn đề chủ yếu được chia thành 3 khu vực:

  • đĩa đọc
  • Sử dụng bộ nhớ (đệm)
  • sử dụng CPU.

Giới thiệu về đọc đĩa: càng có nhiều dữ liệu (tính bằng byte), ổ cứng càng bận và làm chậm hoạt động khác bằng cách sử dụng nó. Giảm kích thước của các hàng đã chọn để tránh phí trên đĩa.

Giới thiệu về sử dụng bộ nhớ: mysql quản lý bộ đệm bên trong, có thể bị kẹt trong một số trường hợp. Tôi không biết đủ về nó để cung cấp cho bạn một câu trả lời thích hợp, nhưng tôi biết điều này chắc chắn là một cái gì đó bạn nên giữ một mắt trên.

Về sử dụng CPU: về cơ bản cpu sẽ nhận được bận rộn khi nó

  • có để tính toán (tham gia, chuẩn bị báo cáo, arithmetics ...)
  • đã làm tất cả những thứ peripheric: byte di chuyển từ đĩa vào bộ nhớ chẳng hạn. Tối ưu hóa các truy vấn của bạn để giảm chi phí cpu. (âm thanh ngớ ngẩn nhưng, tốt, nó luôn luôn trở thành vấn đề anyway ...)

Vì vậy, bây giờ khi biết khi nào có hiệu lực thế chấp? Bằng cách lập cấu hình phần cứng của bạn ... Làm cách nào để cấu hình?

  • định dạng tuyệt đối: sử dụng SHOW INNODB STATUS hoặc SHOW PROFILE để nhận thông tin hữu ích về ổ cứng, bộ nhớ và cpu chính của mysql.
  • hồ sơ tương đối: sử dụng hồ sơ hệ điều hành ưa thích của bạn. Ví dụ: dưới cửa sổ xp, bạn có thể sử dụng số lớn perfmon.exe và xem cho PRIVATE BYTESVIRTUAL BYTES của quá trình mysql. Tôi nói tương đối, bởi vì sau khi truy vấn tốn thời gian trên máy tính của bạn, nó có thể không nằm trong hệ thống của NASA ...

Hy vọng nó sẽ giúp ích.

+0

Cảm ơn, điều đó giúp hiểu rõ mặt phần cứng của mọi thứ rõ ràng hơn nhiều. Tuy nhiên, từ góc đầu tiên, tôi vẫn không hiểu chính xác cách tôi có thể tự tin rằng một truy vấn nhất định sẽ hoặc sẽ không gây ra khóa ... – sungiant

+0

Không có khóa nếu bạn không cập nhật hoặc xóa (chăm sóc CASCADE hoặc TRIGGERS tác dụng phụ) một hàng nhất định trong một giao dịch, hoặc tự thiết lập khóa bằng cách sử dụng lệnh LOCK mysql. Một SELECT đơn giản sẽ KHÔNG BAO GIỜ khóa một hàng. Ngoài ra, chăm sóc động cơ MYISAM mà theo như tôi nhớ khóa toàn bộ bảng rất dễ dàng! – Sebas

+0

Yep MyISAM thực hiện khóa mức bảng khi cập nhật/xóa. Các khóa InnoDB thực hiện khóa mức hàng nếu mệnh đề where sử dụng các khóa duy nhất hoặc khóa chính nếu không nó có thể làm khóa cấp khối hoặc các khóa bảng. –

3

Truy vấn đọc chỉ bị ảnh hưởng bởi mức độ cách ly của các truy vấn khác. Bản thân họ không chặn bảng bao giờ.

Mức cách ly là các chế độ an toàn giao dịch được chỉ định. Nếu một truy vấn khác sử dụng khóa không cho phép đọc bẩn lần đọc của bạn sẽ được giữ cho đến khi truy vấn khác hoàn tất việc ghi hoặc mở khóa.

MVCC là cơ chế cho phép cơ sở dữ liệu tạo phiên bản dữ liệu mới khi cần cập nhật hoặc xóa. Điều đó có nghĩa là khi bạn bắt đầu đọc trên phiên bản hiện tại của dữ liệu, dữ liệu đó sẽ không bị nhiễm các cập nhật/xóa trong tương lai.

Khi bạn bắt đầu ghi dữ liệu hiện tại mặc dù dữ liệu hiện đang được đọc bởi một quy trình khác, bạn đang thực tế viết nội dung mới ở một nơi khác và đánh dấu chúng là phiên bản mới nhất. Mà cuối cùng có nghĩa là không chặn cho quá trình viết (ít nhất là không phải do quá trình đọc).

+0

Xin cảm ơn, điều đó có ý nghĩa rất nhiều, nhưng làm sao người ta biết rằng truy vấn đã cho là đọc. Điều gì sẽ xảy ra nếu bạn có truy vấn đọc có tham gia giống như truy vấn ở trên có nhiều việc phải làm, nó bắt đầu trên kết nối A, sau đó truy vấn khác trên kết nối B cập nhật hàng trong dữ liệu mà A hiện đang cố gắng chọn . Chuyện gì xảy ra? B có đợi B không? A phải dừng lại và bắt đầu lại vì B đã thực hiện thay đổi? Mọi thông tin thêm về điều này sẽ hữu ích nhất. – sungiant

+0

Tôi sẽ chỉ cập nhật câu trả lời của mình. –

2

Đây là một câu hỏi rất chung chung, do đó, đưa ra một câu trả lời chính xác là khó khăn.

Bạn có thể nghĩ về cơ sở dữ liệu như một nhóm tài nguyên được chia sẻ; đặc biệt là vì phần cứng cơ sở dữ liệu của bạn chạy trên có giới hạn vật lý. Thông thường, lý do bạn nhìn thấy một thứ như truy vấn chọn gây ảnh hưởng đến hiệu suất trên các truy vấn khác là vì chúng đều cạnh tranh để sử dụng các tài nguyên vật lý cơ bản như đĩa IO hoặc truy cập RAM hoặc thời gian CPU và không đủ để đi xung quanh .

Vì vậy, các kết quả thực tế bạn thấy sẽ phụ thuộc rất nhiều vào phần cứng vật lý của cơ sở dữ liệu và các cài đặt cấu hình.

Ví dụ trong các ví dụ bạn chọn, các biến có thể là: Dữ liệu truy vấn cần có trong RAM chưa? Nó có thể tra cứu các hàng một cách hiệu quả bằng một chỉ mục không? Nếu nó phải làm IO, có bao nhiêu truy vấn khác đang yêu cầu đọc dữ liệu từ đĩa? Bạn đang sử dụng chỉ mục phụ và phải thực hiện nhiều lần đọc? Cơ sở dữ liệu có thực hiện đọc trước để đệm các trang khác không? Là truy vấn gây ra tuần tự hoặc ngẫu nhiên io? Có bất kỳ bản cập nhật nào chứa khóa trên dữ liệu không? IO đọc được bao nhiêu phần cứng vật lý có thể hỗ trợ?

Bạn sẽ phải trả lời tất cả các câu hỏi đó cho tất cả các truy vấn hiện đang thực hiện để biết liệu chúng có ảnh hưởng đến hiệu suất của các truy vấn khác hay không.

Đây là lý do tại sao DBA tồn tại. Cơ sở dữ liệu bận rộn là hệ thống phức tạp và tất cả là về sự tương tác của nhiều hoạt động khác nhau, tất cả đều có hàng nghìn biến có thể ảnh hưởng đến chúng. Vì vậy, những gì bạn thường làm là tối ưu hóa những thứ bạn có thể kiểm soát cũng như bạn biết cách (phần cứng, cấu hình mysql, lược đồ và chỉ mục) sau đó bắt đầu đo hệ thống khi nó chạy để hiểu những gì đang thực sự xảy ra.

Vì vậy, trong trường hợp của bạn, tôi sẽ nói rằng việc tập trung vào việc đơn giản tối ưu hóa truy vấn của bạn là vô cùng hữu ích hơn. Họ thực thi càng nhanh thì càng ít tài nguyên sử dụng hơn và ít thay đổi hơn sẽ ảnh hưởng đến người khác. Sau đó, bạn học cách phân tích hệ thống. Chỉ cần nhìn vào một điều chậm và hỏi "tại sao điều này lại chậm?" Sau đó sửa chữa nó. Đó là quá trình tối ưu hóa.

Tuy nhiên, trong trường hợp đầu tiên bạn đã viết bằng SELECT ... FOR UPDATE khóa rõ ràng có thể và sẽ là vấn đề hiệu suất lớn. Hãy cẩn thận với những người.

+0

Cảm ơn câu trả lời, bạn có thể cho tôi lời khuyên nào về cách biết liệu truy vấn SQL có gây ra sự cố chặn không. Làm thế nào bạn ngay lập tức biết rằng SELECT ... FOR UPDATE sẽ gây ra vấn đề? Các lệnh SQL khác gây ra các vấn đề tương tự? – sungiant

+0

SELECT FOR UPDATE khóa các hàng cho InnoDB, hoặc khóa bảng cho MyISAM. Nó được sử dụng trong các giao dịch để khóa ổ đĩa trên dữ liệu mà bạn sẽ xử lý và cuối cùng cập nhật. Nó cũng có thể khóa các hàng không khớp với mệnh đề where, tôi không hiểu tại sao chúng cũng bị khóa (khi tôi đọc nó) nhưng nó liên quan đến chúng là một ứng cử viên một phần trong mệnh đề where và không được release. –

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