10/10/2018, 10:06

Giảm thời gian truy vấn dữ liệu?

Bình thường mình thường dùng câu lệnh SQL:
Code:
$sql = "select record1, record2, ... from table where ....";
Với trường hợp có quá nhiều record (rất lớn) thì thời gian select sẽ lâu hơn, vậy có những cách nào để giảm thiểu tối đa thời gian thực hiện? (về câu lệnh lẫn cấu trúc dữ liệu)
Cám ơn.
thuyduongcd viết 12:19 ngày 10/10/2018
đã là câu lệnh thì làm sao mà khác đi được.
Chỉ có thể thêm LIMIT vào để lấy một số record cần thiết thôi. Không ai xử lý vài ngàn record một lúc cả
lucky-boy viết 12:21 ngày 10/10/2018
Lúc thiết kế DB bạn nên chú ý đánh index các trường cần thiết thì khi select sẽ query nhanh hơn.
langtusitinh225 viết 12:08 ngày 10/10/2018
Được gửi bởi thuyduongcd
đã là câu lệnh thì làm sao mà khác đi được.
Có những cách biến hóa câu lệnh để làm cho chương trinh tốt hơn mà bạn.

Không ai xử lý vài ngàn record một lúc cả
Ý mình là mình chọn ra 1 số record từ rất nhiều record thì thời gian sẽ lâu hơn

Lúc thiết kế DB bạn nên chú ý đánh index các trường cần thiết thì khi select sẽ query nhanh hơn.
Không hiểu ý bạn lắm
haindse viết 12:22 ngày 10/10/2018
Một nguyên tắc là bắt buộc phải dùng LIMIT để hạn chế số bản ghi cần lấy ra khi duyệt. Nếu ko có LIMIT thì có nghĩa là tất cả các bản ghi. Không bao giờ có nhu cầu lấy ra một lúc hàng trăm bản ghi để xử lí cả. Nếu có thì phải xem lại thuật toán.
langtusitinh225 viết 12:18 ngày 10/10/2018
Hic đâu có nói lấy ra hàng trăm bản ghi đâu trời.
Một ví dụ: mình có 100 record và cần lấy 10 record với mình có 10000 và cần lấy 10 record thì tốc độ khác nhau. Mình muốn hỏi là có cách nào tốt nhất để lấy ra 10 từ 10000 record mà có thể giảm thiểu tối đa thời gian thực thi
lee_huynh306 viết 12:23 ngày 10/10/2018
Được gửi bởi langtusitinh225
Hic đâu có nói lấy ra hàng trăm bản ghi đâu trời.
Một ví dụ: mình có 100 record và cần lấy 10 record với mình có 10000 và cần lấy 10 record thì tốc độ khác nhau. Mình muốn hỏi là có cách nào tốt nhất để lấy ra 10 từ 10000 record mà có thể giảm thiểu tối đa thời gian thực thi
Với lệnh SELECT và yêu cầu của bạn thì nhiệm vụ tối ưu thời gian thực thi thuộc về DB Engine chứ không phải bản thân người lập trình.
langtusitinh225 viết 12:18 ngày 10/10/2018
Em tìm được 1 bài viết như thế này:

Câu lệnh MySQL để lấy 1 phần tử ngẫu nhiên:
Code:
$sql = "select id from table order by rand() limit 1";
đây đúng là cách ngắn gọn nhất, nhưng nó không phải là 1 cách hay, vì với câu truy vấn này là rất chậm. Lý do là Mysql phải tạo 1 bảng tạm với tất cả kết quả và gán cho mỗi bản ghi một chỉ số thứ tự ngẫu nhiên. Sau đó kết quả được sắp xếp và trả về kết quả. Nó sẽ thực sự là một vấn đề lớn nếu dữ liệu nhiêu. Bạn có thể dùng code bên dứoi, tuy phải thêm mấy dòng nhưng nó thực sự tối ưu về mặt hiệu năng

Code:
$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );
Em chỉ tìm được thôi chứ không biết đúng hay sai nữa
Ai biết được những chiêu tương tự thế này giúp em với nha
Cám ơn
kenphan19 viết 12:11 ngày 10/10/2018
trước khi trả lời câu hỏi của bạn và mấy spamer ở trên, mình xin chú thích cho bạn vài điều.
1. Record và Field là 2 cái khác nhau, ở đây không có chuyện SELECT record1, record2 mà phải là field1, field2.
2. Dùng LIMIT là chính xác như ý bạn rồi mà bạn lại còn hỏi lung tung
3. Thêm Index vào mà bạn còn không biết thì chắc bạn chưa rành lắm về db engine.
Nói chung là bạn nên tìm hiểu căn bản trước rồi hãy tính đến việc optimize db.
thuyduongcd viết 12:21 ngày 10/10/2018
Code:
Có những cách biến hóa câu lệnh để làm cho chương trinh tốt hơn mà bạn.
Câu lệnh là câu lệnh, không có chuyện biến hóa, chỉ có thuật toán xử lý câu lệnh khác nhau mà thôi.
Code:
Em chỉ tìm được thôi chứ không biết đúng hay sai nữa
Cái này chỉ lấy được 1 record ngẫu nhiên thôi. Lập trình là phải mang tính tổng quát để có thể tái sử dụng về sau. Khi lấy 1 record phải nghĩ đến khả năng sẽ lấy n record. Không thể bây giờ muốn lấy 1 record thì làm thế này, lấy 2 record thì làm thế khác.
Còn về đoạn code đó cũng chưa phải là tối ưu nhất đâu, còn có thể tối ưu hơn nữa kìa.
Bài liên quan
0