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

Background

Buffer pool(BF) của mysql quả thực có nhiều lợi ích, và việc warm up buffer pool 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 manual. 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, mình 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, hơn nữa mình lười, 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â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ả:

  1. 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_name and select 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.
  2. 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)

Ngoài lề:

Lợi ích của BF là mysql look index/data của câu query trong BF trước, nếu ko có mới ngó ra hard disk.
Vì thế mà kịch bản benchmark ở local cho thấy sự khác biệt trước/sau khi BF được loaded thì mình vẫn chưa thực hiện được.
Mình đã thực hiện theo cách:
Tạo 1 table có 10M records, có primary key và index ở columns.
Tuy nhiên ko biết cách nào tạo ra số lượng query thật lớn đổ vào DB để đo disk I/O cũng như response time cả.
Anh/chị/bạn nào có cách thực hiện vui lòng comment cho mình biết với. Mình rất cảm ơn.

Quảng cáo

Mình vừa hoàn thành tool này, các bạn vui lòng ghé qua tặng cho mình issue nếu có, hoặc star cổ vũ thì thật là nice :D

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ManhDV

21 bài viết.
34 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
35 6
TL; DR Cấu hình mastermaster trên nhiều node EC2 Mỗi node có nhiều database, với schema giống hệt nhau. Thực hiện điều phối việc read/write b...
ManhDV viết 1 năm trước
35 6
White
14 0
Background Với những database có lượng read lớn thì tầm quan trọng của việc warmup BP đã được nhắc tới nhiều. Nhưng nó có hiệu quả tới mức như thế...
ManhDV viết 12 tháng trước
14 0
White
14 3
Background Bạn có nhớ gì về hồi cấp 3 ko? Ý mình ko phải là hình ảnh em gái xinh nhất khối mặc áo trong và ngoài có mã màu lần lượt là 000 và fff ...
ManhDV viết 11 tháng trước
14 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
21 bài viết.
34 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!