Tối ưu Truy vấn và Cấu trúc Dữ liệu trong MySQL: View và Thủ tục Lưu trữ

Tối ưu hóa thao tác chèn dữ liệu

  • Chèn hàng loạt
    INSERT INTO danh_sach_nguoi_dung (ma, ten) 
    VALUES (101, 'An'), (102, 'Binh'), (103, 'Chau');
  • Quản lý giao dịch
    BEGIN;
    INSERT INTO danh_sach_nguoi_dung VALUES (201, 'Dung'), (202, 'Em'), (203, 'Giang');
    INSERT INTO danh_sach_nguoi_dung VALUES (204, 'Huong'), (205, 'Khoa'), (206, 'Linh');
    COMMIT;
  • Sắp xếp khóa chính
    Chèn ngẫu nhiên: 15, 3, 22, 7, 11
    Chèn tuần tự: 3, 7, 11, 15, 22

Xử lý dữ liệu khối lượng lớn

-- Kích hoạt chế độ nhập từ file cục bộ
SET GLOBAL local_infile = 1;
-- Tải dữ liệu từ file CSV
LOAD DATA LOCAL INFILE '/data/nguoi_dung.csv' 
INTO TABLE danh_sach_nguoi_dung 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';

Tối ưu khóa chính

  • InnoDB tổ chức dữ liệu theo thứ tự khóa chính (Index Organized Table)
  • Chèn khóa chính không tuần tự gây phân mảnh trang
  • Xóa bản ghi kích hoạt cơ chế gộp trang khi vượt ngưỡng 50%
  • Nguyên tắc thiết kế:
    • Ưu tiên khóa tự tăng (AUTO_INCREMENT)
    • Tránh UUID hoặc khóa tự nhiên
    • Tối giản độ dài khóa chính

Tối ưu truy vấn sắp xếp

  • Using index: Trả kết quả trực tiếp từ chỉ mục
  • Using filesort: Cần sắp xếp bộ nhớ (sort buffer)
  • Chiến lược:
    • Xây dựng chỉ mục đa cột theo thứ tự sắp xếp
    • Sử dụng chỉ mục phủ (covering index)
    • Tăng kích thước sort_buffer_size cho tập lớn

Tối ưu phân trang

SELECT s.* 
FROM san_pham s
INNER JOIN (SELECT ma_san_pham FROM san_pham ORDER BY ma_san_pham LIMIT 1000000, 20) tmp 
ON s.ma_san_pham = tmp.ma_san_pham;

Phân tích COUNT()

  • InnoDB: Đếm từng bản ghi (không lưu sẵn số lượng)
  • MyISAM: Trả trực tiếp giá trị đã lưu
  • Hiệu suất: COUNT(*) ≈ COUNT(1) > COUNT(khóa_chính) > COUNT(trường)

Tối ưu cập nhật

  • Khóa hàng chỉ hoạt động khi sử dụng chỉ mục hiệu quả
  • Tránh thay đổi giá trị khóa chính

View (Bảng ảo)

  • Định nghĩa
    CREATE VIEW danh_sach_khach_hang AS
    SELECT ma, ten, email 
    FROM khach_hang 
    WHERE trang_thai = 1;
  • Đặc điểm
    • Không lưu trữ dữ liệu thực
    • Chỉ lưu logic truy vấn
    • Cập nhật được khi không có hàm tập hợp/GROUP BY
  • Lợi ích
    • Đơn giản hóa truy vấn phức tạp
    • Phân quyền chi tiết đến mức cột
    • Cách ly thay đổi cấu trúc bảng gốc

Thủ tục lưu trữ

  • Khởi tạo
    DELIMITER //
    CREATE PROCEDURE tao_nguoi_dung(IN so_luong INT)
    BEGIN
      DECLARE i INT DEFAULT 1;
      WHILE i <= so_luong DO
        INSERT INTO danh_sach_nguoi_dung(ten) VALUES (CONCAT('User_', i));
        SET i = i + 1;
      END WHILE;
    END //
    DELIMITER ;
  • Biến cục bộ
    DECLARE tong_so INT DEFAULT 0;
    SET tong_so = (SELECT COUNT(*) FROM danh_sach_nguoi_dung);
  • Biến hệ thống
    SHOW VARIABLES LIKE 'max_connections';
    SET GLOBAL sort_buffer_size = 1048576;

Thẻ: mysql sql-optimization database-indexing stored-procedures database-views

Đăng vào ngày 10 tháng 6 lúc 16:03