Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

KHÓA CHÍNH ngẫu nhiên cho Innodb

MySQL không "xây dựng lại" chỉ mục trên mỗi lần chèn.

Kích thước trang mặc định của MySQL là 16K. Nó phân bổ các trang này theo gia số 1MB (được gọi là phạm vi).

Khi một bảng được tạo lần đầu tiên (các chỉ mục được tạo lại), các trang được lấp đầy 15/16 đầy đủ, để lại chỗ cho một số chèn ngẫu nhiên (1k chỗ). Nếu các mục nhập chỉ mục của bạn có kích thước 500 byte mỗi mục (kích thước khóa chính + dữ liệu hàng cho chỉ mục được phân nhóm), thì điều đó sẽ dành chỗ cho 2 hàng mới được chèn trước khi phải tách trang.

MySQL giữ giá trị của bản ghi cao nhất và thấp nhất trong tiêu đề trang, vì vậy các bản ghi trong một phạm vi nhất định sẽ đi trên cùng một trang.

Khi MySQL cần chèn một hàng trên một trang đầy đủ, trang đó phải được chia nhỏ. MySQL sẽ thêm một trang mới và chuyển một nửa dữ liệu trang sang trang mới.

Trong một trang, các bản ghi có thể không thực sự theo thứ tự thực tế. Chúng sẽ theo thứ tự mà chúng đã được chèn vào. Chúng được liên kết theo thứ tự thông qua một dạng danh sách liên kết. Vì vậy, ngay cả việc chèn ngẫu nhiên, ngoài nhu cầu chia trang, cũng không khiến dữ liệu được di chuyển xung quanh.

Sau nhiều lần chèn ngẫu nhiên, các trang của bạn sẽ từ 1/2 đến đầy. Một chỉ mục có nhiều nửa trang đầy đủ sẽ ảnh hưởng tiêu cực đến hiệu suất đọc (bạn phải đọc hai trang nửa trang để đọc cùng số lượng bản ghi như một trang đầy đủ 15/16).

Bây giờ, nếu bạn đang chèn các hàng theo thứ tự chỉ mục, thì MySQL chỉ cần thêm vào cuối các trang, lấp đầy 15/16 trang và thêm một mức độ tại một thời điểm của các trang. Hình phạt hiệu suất ít hơn nhiều vì không có sự phân chia các trang, do đó không có sự di chuyển dữ liệu nào được thực hiện, chưa kể đến lợi ích về hiệu suất đọc của các trang gần như đầy đủ.

Việc chèn ngẫu nhiên cũng làm tăng sự phân mảnh của các trang, điều này có thể ảnh hưởng đến hiệu suất đọc nếu bạn thường đọc số lượng lớn các bản ghi tuần tự (hiếm gặp).

Ngoài ra, thay đổi bộ đệm có thể ảnh hưởng đến bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cho phép tất cả các kết nối từ xa, MySQL

  2. Cách tăng kết nối tối đa trong MySQL

  3. Access bị từ chối tạo cơ sở dữ liệu ban đầu- làm cách nào để cấp quyền truy cập phù hợp?

  4. Làm thế nào để lưu trữ tên tệp trong cơ sở dữ liệu, với các thông tin khác trong khi tải hình ảnh lên máy chủ bằng PHP?

  5. MySQL không hỗ trợ nhận xét dòng đơn ở đây. Lý do sẽ là gì?