Hỏi: Tại sao MySQL không tự động cập nhật information_schema và làm cách nào để khắc phục hiện tượng này?
Đ: InnoDB giữ giá trị auto_increment trong bộ nhớ và không lưu giá trị đó vào đĩa.
Hành vi của các truy vấn siêu dữ liệu (ví dụ:SHOW TABLE STATUS
) bị ảnh hưởng bởi cài đặt của innodb_stats_on_metadata
và innodb_stats_persistent
biến.
https://dev.mysql.com/doc /refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata
Việc buộc ANALYZE mỗi khi chúng tôi truy vấn siêu dữ liệu có thể làm giảm hiệu suất.
Khác với cài đặt của các biến đó hoặc buộc thu thập thống kê bằng cách thực thi ANALYZE TABLE
theo cách thủ công , Tôi không nghĩ có cách "khắc phục" cho vấn đề này.
(Tôi nghĩ điều đó chủ yếu là vì tôi không nghĩ rằng đó là một vấn đề cần được khắc phục.)
Để nhận được giá trị cao nhất của cột auto_increment trong bảng, mẫu chuẩn là:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
Điều khiến tôi khó hiểu là tại sao chúng ta cần truy xuất phần thông tin cụ thể này. Chúng ta sẽ sử dụng nó để làm gì?
Chắc chắn, chúng tôi sẽ không sử dụng điều đó trong mã ứng dụng để xác định giá trị được gán cho một hàng mà chúng tôi vừa chèn. Không có gì đảm bảo rằng giá trị cao nhất không phải từ một hàng đã được chèn bởi một số phiên khác. Và chúng tôi có LAST_INSERT_ID()
cơ chế để truy xuất giá trị của một hàng mà phiên của chúng tôi vừa chèn vào.
Nếu chúng ta sử dụng ANALYZE TABLE
để làm mới thống kê, vẫn còn một khoảng thời gian nhỏ giữa số đó và SELECT
tiếp theo ... một phiên khác có thể trượt trong INSERT
khác để giá trị chúng tôi nhận được từ thống kê thu thập có thể "lỗi thời" vào thời điểm chúng tôi truy xuất.