Tối ưu và tăng tốc độ truy vấn cơ sở dữ liệu MYSQL

Tối ưu và tăng tốc độ truy vấn cơ sở dữ liệu MySQL

Như cũng bạn cũng biết, đứng ở góc độ người sử dụng ứng dụng web, chúng ta luôn muốn thời gian đáp ứng dịch vụ là nhanh nhất có thể. Vì vậy khi thiết kế những hệ thống lớn với nhiều người cùng truy cập và sử dụng, thì một trong những điều chúng ta thường nghĩ ngay đầu tiên đó là thiết kế CSDL sao cho có thể đáp ứng tốc độ truy vấn dữ liệu đạt nhanh nhất có thể.

Ở bài viết này, mình sẽ trình bày cho các bạn những kỹ thuật tối ưu hóa hệ thống CSDL với MySQL. Đây là một điều quan trọng để có thể giúp cho ứng dụng web của bạn có tốc độ hoạt động nhanh làm hài lòng người dùng. Các bạn hãy đọc những quy tắc dưới đây để có thể tối ưu CSDL của mình nhé!

Tối ưu và tăng tốc truy vấn MySQL

Tối ưu và tăng tốc truy vấn MySQL

Quy tắc 1: Giảm thiểu sự kết nối tới MySQL

Trong trường hợp nếu bạn sử dụng PHP để kết nối với MySQL thì chúng ta có 2 hàm kết nối là: mysql_connect() và mysql_pconnect(). Về căn bản thì hai hàm kết nối này có các tham số giống như nhau, nhưng nội hàm của chúng lại có cách xử lý khác nhau.

Theo lý thuyết, mỗi lần gọi mysql_connect(), hệ thống sẽ phải khởi tạo một kết nối mới tới MySQL. Còn khi chúng ta sử dụng mysql_pconnect() thì hệ thống sẽ tự động tận dụng kết nối đã được thiết lập trước đó.

Nếu ứng dụng web của bạn được gọi xử lý nhiều lần trong một thời gian ngắn thì hàm mysql_connect() sẽ sử dụng một lượng tài nguyên lớn. Vì vậy, hãy cố gắng sử dụng mysql_pconnect() nếu ứng dụng web của bạn phù hợp.

Lưu ý: Nếu sử dụng mysql_pconnect() thì cơ chế hoạt động transaction của MySQL sẽ bị ảnh hưởng. Bởi vì nếu các client đều tận dụng một kết nối thì sẽ không có sự cô lập các transaction theo nguyên tắc ACID của Transaction.

Quy tắc 2: Thiết lập và truy vấn dữ liệu thông qua Index

Nếu các bạn đã từng học qua cấu trúc dữ liệu và giải thuật, hẳn chúng ta cũng biết các giải thuật tìm kiếm nhanh với cách dựa trên bảng băm và mảng đã sắp xếp từ trước đó là giải thuật tìm kiếm nhị phân nổi tiếng.

Ở trong MySQL khi bạn thực hiện lập Index cho trường dữ liệu thì dữ liệu sẽ được sắp xếp trên một file riêng, khi chúng ta thực hiện truy vấn dữ liệu thông qua các trường index này, các giải thuật tìm kiếm được cài đặt sẵn trên hệ thống sẽ phát huy hiệu quả tối đa của nó, đặc biệt là ở các trường index dạng số.

Vì vậy, các bạn hãy cố gắng truy vấn dữ liệu dựa trên những trường được lập chỉ mục này để ứng dụng web của bạn có thể hoạt động một cách hiệu quả và tối ưu nhất.

Quy tắc 3: Chấp nhận dư thừa dữ liệu

Trong thiết kế CSDL quan hệ, chúng ta cũng đã từng được học các chuẩn thiết kế. Nếu thiết kế theo chuẩn 4 có thể rất đẹp mắt, nhưng khi truy vấn dữ liệu chúng ta sẽ phải xới tung nhiều bảng có quan hệ với nhau có khi chỉ để lấy được ra được một bản ghi.

Ngày xưa, khi giá của ổ cứng cao, dung lượng ổ cứng nhỏ nên các DBA phải thiết kế theo chuẩn 4 để có thể tối ưu giảm dung lượng lưu trữ. Nhưng ngày nay thì đã khác, dung lượng ổ cứng không còn là vấn đề chúng ta cần quan tâm. Vì vậy trong một số trường hợp hãy chịu khó hi sinh tính đẹp đẽ của chuẩn 4 để đổi lại một tốc độ truy vấn nhanh hơn.

Các bạn cũng nên nhớ rằng, truy vấn trên một bảng sẽ nhanh hơn rất nhiều lần khi truy vấn trên nhiều bảng.

Quy tắc 4: Chỉ lấy đúng và đủ dữ liệu cần thiết

Có nhiều bạn thích truy vấn dạng SELECT * FROM. Dấu * ở đây sẽ bắt hệ thống sẽ làm việc nặng nhọc hơn vì phải xử lý nhiều dữ liệu hơn, cũng như trong quá trình chuyển giao dữ liệu từ PHP Client và MySQL Server. Vì vậy thay vì lấy tất cả các trường dữ liệu, các bạn chỉ nên lấy các trường dữ liệu cần thiết.

Nếu lập trình PHP, các bạn cũng không nên sử dụng hàm: mysql_fetch_array() mà hãy sử dụng hàm mysql_fetch_assoc() vì khi sử dụng fetch_array hệ thống sẽ phải trả thêm một mảng chỉ số với tên trường, như vậy các bạn sẽ dễ hình dung và đỡ tốn bộ nhớ vì phải phát sinh thêm một mảng với chỉ số dạng số.

Quy tắc 5: Giải phóng bộ nhớ ngay sau khi sử dụng xong

Theo mặc định thì PHP sẽ thực hiện giải phóng bộ nhớ ngay sau khi dịch xong toàn bộ trang, nhưng trong trường hợp có quá nhiều yêu cầu xử lý một lúc thì tiết kiệm 1 KB cũng là cực quý giá phải không nào?

Sau khi thực hiện các truy vấn xong, các bạn hãy cố gắng sử dụng mysql_free_result() để giải phóng ngay nhé.

Lời kết

Các bạn thấy đó, nếu chúng ta đang xây dựng một ứng dụng web để đáp ứng một lượng lớn người sử dụng thì hãy cố gắng áp dụng các quy tắc trên để có một sản phẩm hoàn hảo nhé!. Mình tin, nếu các bạn áp dụng tốt các quy tắc trên thì website của bạn sẽ có tốc độ truy cập tốt và được người dùng yêu thích đó.