Nếu bạn đã làm việc với MySQL một thời gian, bạn có thể đã nghe các thuật ngữ “khóa cấp bảng” và “khóa cấp hàng”. Các thuật ngữ này đề cập đến mức độ chi tiết của khóa trong MySQL - trong blog này, chúng tôi sẽ giải thích ý nghĩa của chúng và chúng có thể được sử dụng để làm gì.
Mức độ chi tiết của Khóa trong MySQL là gì?
Mỗi công cụ lưu trữ MySQL hỗ trợ các mức độ chi tiết khác nhau cho các khóa của chúng. MySQL có ba cấp độ khóa:khóa cấp độ hàng, khóa cấp độ trang và khóa cấp độ bảng. Mỗi công cụ lưu trữ MySQL thực hiện khóa khác nhau, mang lại cho bạn một số ưu điểm và nhược điểm riêng biệt. Trước tiên, chúng ta sẽ xem xét mức độ chi tiết của khóa là gì, sau đó xem xét cách mọi thứ hoạt động trong các công cụ lưu trữ khác nhau.
Nói rộng ra, các khóa trong MySQL thuộc một trong các loại này. Khóa có thể là:
-
Cấp trang - các loại chi tiết khóa như vậy có sẵn trong các công cụ cũ hơn của MySQL, cụ thể là BDB, hiện đã lỗi thời kể từ MySQL 5.1. Nói tóm lại, BDB là một công cụ lưu trữ có trong các phiên bản MySQL cũ hơn và nó là một công cụ lưu trữ giao dịch thực hiện các khóa cấp độ trang. Vì các loại thông tin chi tiết về khóa này không còn được sử dụng nên chúng tôi sẽ không đi sâu vào chúng ở đây, nhưng nói chung, các khóa này được giới hạn ở dữ liệu và chỉ mục nằm trên một trang cụ thể. Nếu bạn muốn tìm hiểu thêm về BDB, trang trên MariaDB sẽ cung cấp thêm một số thông tin.
-
Mức bảng - MySQL sử dụng khóa mức bảng cho tất cả các công cụ lưu trữ ngoại trừ InnoDB.
-
Row-level - khóa cấp hàng được InnoDB sử dụng.
Ưu điểm và Nhược điểm của Khóa cấp bảng
MySQL sử dụng khóa cấp bảng cho tất cả các công cụ lưu trữ ngoại trừ InnoDB có nghĩa là khóa cấp bảng được sử dụng cho các bảng chạy công cụ lưu trữ MyISAM, MEMORY và MERGE, chỉ cho phép một phiên cập nhật bảng tại một thời điểm . Khóa cấp bảng có một số ưu điểm khác biệt so với khóa cấp hàng (ví dụ:khóa cấp bảng nói chung yêu cầu bộ nhớ ít hơn một chút so với khóa cấp hàng vì khóa cấp hàng yêu cầu một số bộ nhớ trên mỗi hàng (hoặc nhóm) của các hàng được khóa và nó thường nhanh vì chỉ có một khóa được tham gia. Khóa ghi bảng được đặt trên bàn nếu không có khóa trên đó - nếu có ổ khóa sẵn trên bàn được đề cập, các yêu cầu khóa bảng sẽ được đưa vào hàng đợi yêu cầu đọc. Điều đáng nói là khóa cấp bảng cũng có một số nhược điểm riêng biệt đối với chính nó - ví dụ:nó có thể không phù hợp lắm cho các ứng dụng yêu cầu nhiều giao dịch "qua lại" (ví dụ:, một ứng dụng ngân hàng trực tuyến) vì chỉ một phiên có thể ghi vào bảng bất kỳ lúc nào và một số bảng hỗ trợ khóa cấp bảng (chẳng hạn như MyISAM) không hỗ trợ mô hình ACID.
Dưới đây là một ví dụ:hãy tưởng tượng một ứng dụng ngân hàng sử dụng hai bảng trong cơ sở dữ liệu - giả sử những bảng đó được gọi là "kiểm tra" và "tiết kiệm". Bạn cần chuyển 100 đô la từ tài khoản séc của một người sang tài khoản tiết kiệm của anh ta. Về mặt logic, bạn sẽ thực hiện các bước sau:
-
Đảm bảo số dư tài khoản lớn hơn 100 đô la.
-
Trừ 100 đô la vào tài khoản séc.
-
Thêm 100 đô la vào tài khoản tiết kiệm.
Để thực hiện những hành động này, bạn sẽ cần một vài truy vấn, ví dụ:
SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;
Những truy vấn này có thể trông đơn giản, nhưng nếu bạn sử dụng MyISAM (chúng tôi sử dụng MyISAM làm ví dụ vì đây là một trong những công cụ lưu trữ chính hỗ trợ khóa cấp bảng), bạn nên quen với thực tế là engine không hỗ trợ ACID, điều đó có nghĩa là nếu máy chủ cơ sở dữ liệu gặp sự cố khi thực hiện bất kỳ truy vấn nào trong số đó, bạn thật không may mắn:mọi người có thể kết thúc bằng tiền mặt trong cả hai tài khoản hoặc cả hai tài khoản. Công cụ duy nhất hỗ trợ các giao dịch dựa trên ACID trong MySQL là InnoDB, vì vậy nếu bạn cần nhiều giao dịch đáng tin cậy, thì có thể đáng để xem xét. InnoDB cũng hỗ trợ khóa cấp độ hàng - đây là những gì chúng ta sẽ xem xét bây giờ.
Ưu điểm và Nhược điểm của Khóa cấp hàng
MySQL sử dụng khóa mức hàng cho các bảng InnoDB để hỗ trợ truy cập ghi đồng thời theo nhiều phiên. Một số ưu điểm của việc sử dụng khóa cấp độ hàng bao gồm khả năng khóa một hàng trong thời gian dài và ít xung đột khóa hơn khi nhiều luồng truy cập các hàng khác nhau. Tuy nhiên, khóa cấp độ hàng cũng có nhược điểm:một trong số đó là khóa cấp độ hàng thường chiếm nhiều bộ nhớ hơn so với khóa cấp độ trang hoặc cấp bảng, nó cũng thường chậm hơn khóa cấp độ trang hoặc cấp bảng vì động cơ phải mua thêm khóa. InnoDB là một trong những công cụ đang hỗ trợ cơ chế khóa cấp độ hàng:nó cũng tuân thủ ACID có nghĩa là nó rất phù hợp cho các ứng dụng dựa trên giao dịch (tham khảo ví dụ ở trên). Bây giờ chúng ta sẽ xem xét mức độ chi tiết của khóa hoạt động như thế nào trong một trong các công cụ lưu trữ MySQL.
Khóa mức độ chi tiết hoạt động như thế nào trong InnoDB?
InnoDB được biết đến rộng rãi là hỗ trợ khóa cấp hàng, nhưng cũng cần lưu ý rằng động cơ hỗ trợ nhiều kiểu khóa, có nghĩa là bạn có thể sử dụng cả khóa cấp hàng và cấp bảng. InnoDB thực hiện khóa cấp độ hàng bằng cách đặt các khóa chia sẻ hoặc khóa riêng trên các bản ghi chỉ mục mà nó gặp phải khi tìm kiếm hoặc quét chỉ mục bảng. Khóa dùng chung là một khóa cho phép giao dịch giữ khóa đọc hàng được đề cập, mặt khác, một khóa độc quyền cho phép giao dịch giữ khóa cập nhật hoặc xóa một hàng.
InnoDB cũng có các loại khóa khác - một số trong số chúng bao gồm khóa chia sẻ và khóa độc quyền, khóa có chủ đích, khóa ghi, khóa khoảng cách, khóa tiếp theo và khóa chủ định tiếp theo. Ví dụ, các khóa ý định cũng có thể được chia sẻ hoặc dành riêng - các khóa như vậy thường chỉ ra rằng một giao dịch có ý định đặt một loại khóa nhất định (khóa chia sẻ hoặc khóa độc quyền) trên các hàng riêng lẻ trong bảng, khóa bản ghi là một khóa bản ghi chỉ mục, v.v.
Nói chung, mức độ chi tiết của khóa InnoDB khác với mức độ chi tiết của khóa hiện có trong các công cụ lưu trữ MySQL khác (ví dụ:MyISAM) vì khi khóa cấp bảng được sử dụng, chỉ có một phiên để cập nhật các bảng nhất định tại một thời gian có thể chạy. Khi khóa cấp độ hàng được sử dụng, MySQL hỗ trợ truy cập ghi đồng thời trên nhiều phiên làm cho công cụ lưu trữ khóa cấp độ hàng (InnoDB) trở thành lựa chọn phù hợp cho các ứng dụng quan trọng.
Khóa mức độ chi tiết và bế tắc
Khóa mức độ chi tiết và khóa mức trong MySQL có thể là một điều tuyệt vời, nhưng chúng cũng có thể gây ra vấn đề. Một trong những vấn đề thường gặp nhất do mức độ chi tiết của khóa là deadlock - một sự cố xảy ra khi các giao dịch MySQL khác nhau không thể tiếp tục vì mỗi giao dịch trong số chúng giữ một khóa mà giao dịch kia cần. Rất may, khi sử dụng công cụ lưu trữ InnoDB, tính năng phát hiện bế tắc được bật theo mặc định - khi phát hiện thấy bế tắc, InnoDB sẽ tự động khôi phục giao dịch. Nếu bạn gặp phải bế tắc khi xử lý mức độ chi tiết của khóa trong MySQL, đừng lo lắng - chỉ cần xem xét khởi động lại giao dịch của bạn. Để chủ động theo dõi cơ sở dữ liệu của mình, bạn cũng nên xem xét sử dụng các tính năng do ClusterControl cung cấp.
ClusterControl có thể giúp gì cho bạn?
Dưới đây là một số điều mà ClusterControl do Somenines phát triển có thể giúp bạn:
-
Bảo vệ tất cả dữ liệu doanh nghiệp của bạn
-
Nếu dữ liệu của bạn bị hỏng (nguyên nhân có thể do không sử dụng công cụ lưu trữ tuân thủ ACID hoặc cũng có thể do các yếu tố khác như được mô tả ở trên) công cụ có thể chạy một quy trình tự động thực sự xác minh rằng bạn có thể khôi phục dữ liệu của mình.
-
Công cụ có thể cho bạn biết cơ sở dữ liệu nào chưa được sao lưu hoặc cho bạn biết trạng thái sao lưu của bạn (cho dù họ đã thành công hoặc họ đã thất bại)
-
-
Tự động hóa các hoạt động cơ sở dữ liệu của bạn
-
ClusterControl có thể giúp bạn đảm bảo rằng hệ thống, nhà phát triển và DBA của bạn quản lý toàn bộ cụm cơ sở dữ liệu một cách hiệu quả với rủi ro tối thiểu khi sử dụng trong ngành các phương pháp hay nhất
-
-
Quản lý hiệu quả cơ sở hạ tầng cơ sở dữ liệu của bạn nói chung
-
Sự thay đổi công nghệ ngày nay kết hợp với các giải pháp cơ sở hạ tầng phức tạp đòi hỏi các công cụ và kiến thức tiên tiến để đạt được tính khả dụng cao và hiệu suất tối ưu cho các ứng dụng quan trọng trong kinh doanh của bạn. ClusterControl cũng có thể giúp bạn triển khai, giám sát, quản lý và mở rộng các công nghệ cơ sở dữ liệu nguồn mở phổ biến nhất bao gồm MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB và phần còn lại.
-
Để tìm hiểu thêm về cách ClusterControl có thể giúp hợp lý hóa hoạt động kinh doanh của bạn, hãy nhớ theo dõi blog cơ sở dữ liệu của Somenines.
Tóm tắt
Các công cụ lưu trữ MySQL khác nhau có sẵn các loại khóa chi tiết khác nhau. Trước khi quyết định công cụ lưu trữ bạn nên sử dụng, hãy nhớ biết càng nhiều thông tin về công cụ lưu trữ được đề cập càng tốt (ví dụ như MyISAM đã lưu ý nên tránh sử dụng MyISAM khi xử lý dữ liệu quan trọng vì nó không tuân thủ ACID), hiểu tất cả các hàm ý về hiệu suất có liên quan bao gồm chi tiết khóa, bế tắc và phần còn lại và hãy lựa chọn một cách khôn ngoan.