So sánh các câu lệnh warmup primary key vào buffer pool với engine InnoDB mysql


#tech #mysql #vi

Background

Buffer pool(BF) của mysql quả thực có nhiều lợi ích, và việc warm up BP luôn là việc nên làm đầu tiên mỗi khi start/reload/create new mysql.

  • Mysql version >= 5.6 đã hỗ trợ đơn giản hoá việc save/restore BF state bằng cấu hình, nên việc cần làm chỉ là cấu hình là xong.
  • Và trong các case khác, như cấu hình 1 slave mới, hoặc mysql version < 5.6, thì phải thực hiện việc này một cách thủ công. Cơ chế chung của việc warmup là “touch” vào primary key và index của table đó.
  • Tuy nhiên, “touch” thế nào cho tối ưu nhất? Trong quá trình thực hiện benchmark cho tool này, người viết thấy có 1 số điều thú vị như dưới đây.

Testing

Việc testing theo các case khác nhau khá dài, và chủ yếu là người viết cực kỳ lười :v, nên các bạn vui lòng đọc tại link này.

TL;DR

Để warmup primary key của table, thì câu lệnh nào dưới đây là tối ưu trong trường hợp:

  • Table chỉ có primary key.
  • Table ngoài primary key ra còn có nhiều hơn hoặc bằng một index nữa

Các câu lệnh thử nghiệm:

  • select count(*) from table_name
  • select count(*) from table_name where non_index_column = 0 or non_index_column = ‘0’
  • select sum(primary_key) from table_name ?

Kết quả:

Table with only primary key:

  • select count(*) from table_name where non_index_column = 0 or non_index_column = '0' cho kết quả nhiều pages được load vào BF là nhiều nhất.
  • select count(*) from table_nameselect sum(primary_key) from table_name cho cùng 1 kết quả số pages được load, nhưng ít hơn câu trên.

Table with primary key and other index(es):

  • select count(*) from table_name: primary_key will be loaded.
  • select sum(primary_key) from table_name: other_index will be loaded, not primary key (so funny).
  • select count(*) from table_name where non_index_column = 0 or non_index_column = '0': primary_key sẽ đựơc load với số lượng lớn nhất.

Kết luận:

  • Nên manual bằng cách touch primary key theo cách đảm bảo là tất cả primary key sẽ được “sờ” tới, bằng cách add thêm điều kiện where cho non_index_column.
  • Nên dùng count(*) thay cho sum(primary_key)


Related Posts

Tìm hiểu bộ lọc Bloom (Bloom filter) và một số ứng dụng dưới con mắt đời thường

Bloom filter không phải là một cài đặt cụ thể, nó là một tư tưởng thoả mãn tính chất False positive.

Higher-Order Function (HOF) và Currying

HOF và Currying là hai kỹ thuật không khó, thậm chí bạn đang dùng nó hàng ngày mà không để ý. Cùng tìm hiểu chúng thông qua một số ví dụ.

Kỹ thuật sửa lỗi Reed - Solomon

Tìm hiểu một số khái niệm và tính chất của kỹ thuật sửa lỗi Reed - Solomon, với sự xuất hiện của Ưng Hoàng Phúc, Ngọc Trinh :v

Vài suy nghĩ về nghề Lập Trình Viên (LTV)

Nghề LTV dưới góc nhìn của người viết. Liệu nó có phải là nghề "đáng làm" hay không?

Xây dựng ứng dụng chat sử dụng websocket có khó không?

A-to-Z Xây dựng ứng dụng realtime chat sử dụng action cable rails 5

Tổ hợp, chỉnh hợp và bài toán đếm cơ bản

Một số bài toán về chỉnh hợp, tổ hợp cơ bản đã học hồi cấp 3 và áp dụng vào bài toán đếm

Pinterest đã thực hiện scaled MySQL của họ như thế nào

Bài viết lược dịch từ Sharding Pinterest How we scaled our MySQL fleet, một bài viết theo mình đánh giá là rất chất lượng, và có nhiều giá trị có thể tham khảo.

Thực hiện benchmark (BM) MySQL InnoDB Buffer Pool(BP) trước và sau khi được warmup

Mình thực hiện BM này cho chính [tool mình viết](https://github.com/manhdaovan/mysql_warmup), cũng là 1 tool đơn giản thôi, tiện thể đem kết quả lên khoe với mọi người luôn.

Muốn đi Nhật - Cần làm gì?

Kinh nghiệm bản thân về việc chuẩn bị sang vùng kinh tế mới :v