MyISAM để đọc dữ liệu


10

Tôi có một bảng với khoảng 1 tỷ hàng và tỷ lệ đọc là 98%.

Tôi đã thử điều chỉnh cơ sở dữ liệu, với các công cụ lưu trữ khác nhau (MyISAM và InnoDB)

Sau đó chạy một vài thử nghiệm để xem hiệu suất

Trong mệnh đề where tôi có ID khóa chính và có vẻ như vì MyISAM Key Cache lưu trữ tất cả các chỉ mục trong bộ đệm của nó, sử dụng MyISAM dường như khá nhanh, nhanh hơn khoảng 2 lần so với InnoDB

Nhưng đối với InnoDB, nó dường như chậm hơn !! Có phải là InnoDB không sử dụng bất kỳ bộ đệm nào để tải trước các chỉ mục?


có lẽ bất kỳ người điều hành kích hoạt hạnh phúc bỏ phiếu để đóng câu hỏi có thể giải thích động cơ của họ?
pQd

Bạn có thể cho chúng tôi một số ý tưởng về kích thước của cơ sở dữ liệu và bảng trong câu hỏi? Tổng kích thước trên đĩa sẽ hữu ích. Ngoài ra, thông số kỹ thuật của máy bạn đang chạy là gì?
Dave Rix

Câu trả lời:


6

Trước khi bạn quyết định MyISAM hoặc InnoDB, bạn sẽ phải xem qua cả hai Công cụ lưu trữ về cách thức mỗi bộ nhớ cache

MyISAM

Khi đọc, chỉ mục của bảng MyISAM có thể được đọc một lần từ tệp .MYI và được tải trong Bộ nhớ cache khóa MyISAM (có kích thước bằng key_buffer_size ). Làm thế nào bạn có thể làm cho bảng MyISAM .MYD nhanh hơn để đọc? Với cái này:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Tôi đã viết về điều này trong các bài viết trước đây của tôi

InnoDB

OK, còn InnoDB thì sao? InnoDB có thực hiện bất kỳ I / O đĩa nào cho các truy vấn không? Đáng ngạc nhiên, đúng vậy !! Có lẽ bạn đang nghĩ tôi điên khi nói điều đó, nhưng nó hoàn toàn đúng, ngay cả đối với các truy vấn CHỌN . Tại thời điểm này, có lẽ bạn đang tự hỏi "Làm thế nào trên thế giới InnoDB thực hiện I / O đĩa cho các truy vấn?"

Tất cả quay trở lại với InnoDB là một Công cụ lưu trữ giao dịch hoàn toàn ACID . Để cho InnoDB để được giao dịch, nó có để hỗ trợ Itrong ACID, đó là ly. Kỹ thuật duy trì sự cô lập cho các giao dịch được thực hiện thông qua MVCC, Multiversion Concurrency Control . Nói một cách đơn giản, InnoDB ghi lại dữ liệu trông như thế nào trước khi các giao dịch cố gắng thay đổi chúng. Trường hợp đó được ghi lại? Trong tệp không gian bảng hệ thống, được gọi là ibdata1. Điều đó đòi hỏi I / O đĩa .

SO SÁNH

Vì cả InnoDB và MyISAM đều thực hiện I / O trên đĩa, yếu tố ngẫu nhiên nào quyết định ai nhanh hơn?

  • Kích thước của cột
  • Định dạng cột
  • Bộ nhân vật
  • Phạm vi của các giá trị số (yêu cầu INTs đủ lớn)
  • Hàng được chia thành nhiều khối (Chuỗi hàng)
  • Phân mảnh dữ liệu gây ra bởi DELETEsUPDATEs
  • Kích thước của Khóa chính (InnoDB có Chỉ mục cụm, yêu cầu hai lần tra cứu khóa)
  • Kích thước của mục nhập chỉ mục
  • Danh sách cứ kéo dài...

TIẾNG VIỆT

Do đó, trong môi trường đọc nhiều, bảng MyISAM có Định dạng hàng cố định có thể vượt trội hơn so với InnoDB đọc ra khỏi Nhóm đệm InnoDB nếu có đủ dữ liệu được ghi vào nhật ký hoàn tác có trong ibdata1 để hỗ trợ hành vi giao dịch áp đặt trên dữ liệu InnoDB. Lập kế hoạch loại dữ liệu, truy vấn và công cụ lưu trữ của bạn thực sự cẩn thận. Khi dữ liệu phát triển, việc di chuyển dữ liệu trở nên rất khó khăn.

Nhân tiện, tôi đã viết một cái gì đó như thế này 5 ngày trước: Làm cách nào để chỉ định giới hạn bộ nhớ cho myQuery?


Liệu innodbe có thực sự tạo ra bất kỳ đĩa nào đọc khi tất cả dữ liệu đã có trong vùng đệm và không có yêu cầu sửa đổi dữ liệu đồng thời, chỉ đọc?
pQd

Theo suy đoán của tôi, khi người hỏi có 1 tỷ hàng trong db của anh ta, thì anh ta không có khả năng có tất cả bộ nhớ cache trong RAM trong nhóm bộ đệm - do đó sẽ có các yêu cầu đọc để lấy dữ liệu bên ngoài nhóm bộ đệm và trên đĩa?
Dave Rix

3

MyISAM sẽ luôn chạy nhanh hơn rất nhiều so với innodb khi không có sự tranh chấp về dữ liệu. Bắt đầu thêm nhiều phiên cố gắng cập nhật cùng một tablse và innodb rất nhanh chóng có được lợi thế về hiệu suất.

Cách bạn điều chỉnh hệ thống cho 2 động cơ rất khác nhau.

Lý do mà các công cụ khác nhau tồn tại là do khối lượng công việc / mẫu truy cập khác nhau tồn tại.


2

bạn phải 'hâm nóng' innodb. ví dụ: bằng cách phát lại nhật ký truy cập hoặc chạy một số truy vấn thông minh sẽ chạm vào từng giá trị từ chỉ mục.

hãy xem ở đây hoặc ở đây .

Tôi hy vọng bạn không sử dụng cài đặt mysql mặc định cho innodb - chúng phù hợp với phần cứng từ ~ 2000.


Tôi đã thực hiện các thay đổi trong cấu hình mặc định, cũng đã chạy truy vấn nhiều lần, khoảng 30 lần, nhưng tạo ra kết quả gần như tương tự. Nó nhanh hơn sau một vài lần thử, nhưng vẫn chậm hơn MYISAM, cũng đã sử dụng MariaDB (phiên bản mới nhất)
Akash


0

Sau khi điều chỉnh thêm InnoDB trên MariaDB, tôi đã tăng innodb_buffer_pool_sizekích thước cơ sở dữ liệu InnoDB của mình, vì làm như vậy, InnoDB đã bắt đầu tìm nạp các hàng nhanh hơn

Tôi cho rằng điều chỉnh InnoDB khá quan trọng theo nhu cầu cơ sở dữ liệu của bạn

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.