Muốn đo index làm chậm tốc độ ghi (INSERT/UPDATE) bao nhiêu lần, bạn phải so sánh:

  • Thời gian ghi khi có index
  • Thời gian ghi khi không có index

Sau đó lấy tỷ lệ.

Vì MySQL không có sẵn metric “index làm chậm bao nhiêu lần”, ta phải benchmark thủ công bằng stored procedure.


🎯 Ý tưởng đo

  1. Tạo 1 bảng test
  2. INSERT N bản ghi khi không có index
  3. Thêm index
  4. INSERT N bản ghi tương tự
  5. So sánh thời gian

✅ Stored Procedure benchmark index write cost

DELIMITER $$
CREATE PROCEDURE benchmark_index_write()
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE start_time DATETIME(6);
    DECLARE end_time DATETIME(6);
    DECLARE no_index_time DOUBLE;
    DECLARE with_index_time DOUBLE;
    -- Xoá bảng nếu tồn tại
    DROP TABLE IF EXISTS test_index_perf;
    -- Tạo bảng không index
    CREATE TABLE test_index_perf (
        id INT AUTO_INCREMENT PRIMARY KEY,
        col1 VARCHAR(255),
        col2 INT
    ) ENGINE=InnoDB;
    -- =========================
    -- TEST KHÔNG INDEX
    -- =========================
    SET start_time = NOW(6);
    SET i = 0;
    WHILE i < 100000 DO
        INSERT INTO test_index_perf (col1, col2)
        VALUES (UUID(), FLOOR(RAND()*100000));
        SET i = i + 1;
    END WHILE;
    SET end_time = NOW(6);
    SET no_index_time = TIMESTAMPDIFF(MICROSECOND, start_time, end_time) / 1000000;
    -- =========================
    -- ADD INDEX
    -- =========================
    CREATE INDEX idx_col2 ON test_index_perf(col2);
    -- =========================
    -- TEST CÓ INDEX
    -- =========================
    SET start_time = NOW(6);
    SET i = 0;
    WHILE i < 100000 DO
        INSERT INTO test_index_perf (col1, col2)
        VALUES (UUID(), FLOOR(RAND()*100000));
        SET i = i + 1;
    END WHILE;
    SET end_time = NOW(6);
    SET with_index_time = TIMESTAMPDIFF(MICROSECOND, start_time, end_time) / 1000000;
    -- =========================
    -- KẾT QUẢ
    -- =========================
    SELECT 
        no_index_time AS seconds_without_index,
        with_index_time AS seconds_with_index,
        (with_index_time / no_index_time) AS slowdown_ratio;
END$$
DELIMITER ;

Chạy:

CALL benchmark_index_write();

📊 Kết quả bạn sẽ thấy dạng:

seconds_without_indexseconds_with_indexslowdown_ratio
1.22.82.33

=> Nghĩa là index làm chậm ghi khoảng 2.3 lần


🧠 Thực tế slowdown bao nhiêu?

Phụ thuộc:

  • Số lượng index
  • Kiểu index (BTREE / FULLTEXT)
  • Page size
  • Buffer pool
  • Disk (SSD vs HDD)
  • Random vs Sequential insert
  • Clustered index fragmentation

Thực tế:

Số index phụGhi chậm thêm
1 index~1.5–2x
3–4 index~3–5x
8+ indexCó thể 10x

🚀 Cách đo chuyên nghiệp hơn (production)

Thay vì procedure loop 100k lần (vì slow do context switch):

Dùng:

INSERT INTO table
SELECT ...

Hoặc generate số bằng recursive CTE (MySQL 8).

Hoặc đo bằng:

SHOW GLOBAL STATUS LIKE 'Innodb_rows_inserted';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_write_requests';

Hoặc dùng:

performance_schema.events_statements_summary_by_digest