MySQL cực kỳ chậm trên các truy vấn CHỌN rất đơn giản


10

Chúng tôi có một ứng dụng web đơn giản chạy trên máy ảo lưu dữ liệu của nó trong cơ sở dữ liệu MySQL 5.5 với công cụ InnoDB. Mọi thứ hoạt động tốt trong khoảng ba năm, nhưng đột nhiên nó trở nên cực kỳ chậm.

Ví dụ, tôi có một địa chỉ giữ bảng rất đơn giản:

CREATE TABLE `addresses` (
  `address_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) CHARACTER SET latin1 NOT NULL,
  `firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
  `street` varchar(64) CHARACTER SET latin1 NOT NULL,
  `housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
  `zip` varchar(5) CHARACTER SET latin1 NOT NULL,
  `city` varchar(64) CHARACTER SET latin1 NOT NULL,
  `email` varchar(64) CHARACTER SET latin1 NOT NULL,
  `phone` varchar(16) CHARACTER SET latin1 NOT NULL,
  `birthdate` date NOT NULL,
  PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

Bảng này chứa khoảng 800 mục thực sự không nhiều. Nhưng chạy truy vấn

SELECT * FROM addresses

cho mục đích thử nghiệm, nó dường như không bao giờ kết thúc. Tôi đã kiểm tra điều này với mysql CLI trên máy chủ: Nó xuất ra một số hàng của bảng và sau đó đợi rất lâu cho đến khi nó xuất ra các hàng tiếp theo.

Vì vậy, có thể đó là một vấn đề trong giai đoạn gửi dữ liệu, nhưng tôi không chắc chắn.

VM có 2GB RAM và chỉ có 320 MB được sử dụng. CPU cũng chạy ở mức rất thấp 1 đến 2%. mytop không hiển thị bất kỳ truy vấn nào khác đang chặn máy chủ. Quản trị viên CNTT nói rằng họ không thay đổi bất cứ điều gì ở phía phần cứng.

Tôi đã thử một số thứ như khởi động lại máy chủ cơ sở dữ liệu, khởi động lại máy ảo. Không có gì giúp được.

biên tập:

EXPLAIN SELECT * FROM addresses

cho tôi kết quả này:

+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | addresses | ALL  | NULL          | NULL | NULL    | NULL |  793 |       |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

Hộp ảo, Xen hay cái gì khác? Làm thế nào là đĩa chủ được thiết lập? Có máy ảo nào khác trên cùng một hộp chạy chậm không? Trả lời những câu hỏi đó có thể tiết lộ câu trả lời
Matt

Tôi không phải là chủ sở hữu của hypanneror, vì vậy tôi thực sự không thể trả lời điều này. Tôi đã hỏi quản trị viên của nhà ảo thuật xem họ có biết bất kỳ thay đổi nào gần đây không, nhưng anh ta nói không.
tabb

nếu bạn có thể, hãy tắt mysql và chạy một số điểm chuẩn của đĩa và bộ nhớ. Không cần phải phức tạp. Ý tưởng là chỉ cô lập nếu đó là một vấn đề với mysql, có lẽ là vấn đề về chỉ số như được chỉ ra trong câu trả lời dưới đây, hoặc phổ biến hơn.
Matt

Điểm hay, tôi đã trải nghiệm nó có lẽ không phải là một vấn đề mysql. Chạy mysql -u username -ppassword mydb -e 'SELECT * FROM addresseslà đầu ra chậm, nhưng thêm `> test.txt`, nó chạy rất nhanh. Bây giờ đây có lẽ sẽ là một câu hỏi khác!? Làm thế nào tôi có thể điều tra về điều này?
tabb

Liên hệ với chủ sở hữu của trình ảo hóa và yêu cầu họ kiểm tra nhật ký xem có lỗi nào không. Cụ thể là lỗi đĩa. Nói với anh ấy các triệu chứng của bạn. Sao lưu ngay.
Matt

Câu trả lời:


13

Nếu tải cpu thấp thì điều này cho thấy rằng không có vấn đề gì với các chỉ mục bị thiếu, nếu đó là trường hợp truy vấn sẽ chỉ cần có thêm quyền truy cập cpu và đĩa. Ngoài ra, bạn nói rằng nó hoạt động tốt trong 3 năm.

Bạn đã kiểm tra tốc độ truy cập đĩa chung (cụ thể trên phân vùng nơi đặt cơ sở dữ liệu)? Ví dụ như sử dụng dd như ở đây . Những gì bạn đang mô tả âm thanh như một đĩa chết hoặc đột kích nửa chết. Có bản sao lưu tôi hy vọng?


Đó là một điểm hay. Nó có thể là một cái gì đó đơn giản như một lỗi đĩa trên máy chủ.
Matt

9

Bạn có thể thử một vài thứ,

  1. Bạn có thiết lập chỉ mục?

Lập chỉ mục cho phép tìm nhanh các bản ghi mà không cần thực hiện quét toàn bộ bảng trước, giảm đáng kể thời gian thực hiện.

CREATE INDEX idx_name ON addresses(name);
  1. Trước khi chạy truy vấn, sử dụng từ khóa EXPLAIN trước,

Khi được sử dụng trước truy vấn SELECT, nó sẽ mô tả cách MySQL dự định thực hiện truy vấn và số lượng hàng cần xử lý trước khi kết thúc.

  1. Thực hiện một số thay đổi đối với mysql.ini của bạn, nếu VM của nó tăng RAM và định cấu hình mysql.ini của bạn để xem hiệu suất có tăng không.

Có rất nhiều tối ưu hóa MySQL có thể hướng dẫn bạn.

Giúp điều này giúp


Được rồi, nhưng việc tạo một chỉ mục trên một bảng khá nhỏ (<800 hàng) dường như không hữu ích như tôi cần. Phải mất hơn một phút để hoàn thành truy vấn được trích dẫn ở trên. Việc quét toàn bộ bảng của một bảng nhỏ như vậy không nên mất nhiều thời gian.
tabb

Vậy ... bạn đã thêm chỉ mục chưa? Nếu bạn không chắc vấn đề là gì thì tôi sẽ bắt đầu cơ bản và giải quyết vấn đề của mình. Thêm chỉ mục sẽ chỉ tăng hiệu suất nếu được thực hiện chính xác.
Anthony Fornito

Có, tôi đã thêm một chỉ mục trên cột tên. Nhưng truy vấn trên của tôi thậm chí không có bất kỳ mệnh đề WHERE hạn chế nào, vì vậy nó sẽ phải đọc toàn bộ bảng và in ra. Đã thêm chỉ số không giúp được.
tabb

Tôi đã thêm kết quả của truy vấn EXPLAIN ở trên. Điều này có vẻ tốt với tôi, nhưng hiệu suất vẫn còn rất thấp. Tôi không thể tăng RAM vì tôi không phải là quản trị viên của trình quản lý ảo hóa. Nhưng htopcho thấy chỉ có 307 MB trong số 2050 MB RAM được sử dụng.
tabb

Về các chỉ mục bạn thực sự cần phải suy nghĩ về những cột nào để lập chỉ mục, bạn không muốn chỉ mục tất cả mọi thứ, lập chỉ mục những cột có số tiền lớn nhất, tôi đang đưa ra một số giả định hoang dã về điều này nhưng tôi sẽ bắt đầu bằng namevà 'tên đầu tiên'. Thứ hai bạn có chắc là bạn đã lập chỉ mục chính xác? could_keys: NULL nếu cột là NULL, nó chỉ ra rằng không có chỉ mục liên quan nào có thể được tìm thấy.
Anthony Fornito
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.