10/10/2018, 09:37

em cần các bác giúp tối ưu hoá code này.

xin chào các bác, em là chủ website www.ketqua888.com,

trang web của em là trang web về TƯỜNG THUẬT KẾT QUẢ XỔ SỐ TRỰC TIẾP, mô hình như sau:




Trong đó:

(*) Table một là 1 bảng gồm 7 cột và 7 dòng.




(*) người dùng sẽ truy cập file ketqua.php để xem tường thuật trực tiếp kết quả xổ số. File này có nhiệm vụ lấy kết quả từ bảng mang tên TABLE1 trên cơ sở dữ liệu và 10 giây lại refresh một lần bằng JAVASCRIP để lấy kết quả mới.

FIle này dùng hàm mysql_query(SELECT) để lấy kết quả từ table 1

Code:
//SELECT
$result0 = mysql_query("SELECT * FROM table1 WHERE Tengiai='0'", $conn);
$result1 = mysql_query("SELECT * FROM table1 WHERE Tengiai='1'", $conn);
$result2 = mysql_query("SELECT * FROM table1 WHERE Tengiai='2'", $conn);
$result3 = mysql_query("SELECT * FROM table1 WHERE Tengiai='3'", $conn);
$result4 = mysql_query("SELECT * FROM table1 WHERE Tengiai='4'", $conn);
$result5 = mysql_query("SELECT * FROM table1 WHERE Tengiai='5'", $conn);
$result6 = mysql_query("SELECT * FROM table1 WHERE Tengiai='6'", $conn);
$result7 = mysql_query("SELECT * FROM table1 WHERE Tengiai='7'", $conn);
$result9 = mysql_query("SELECT * FROM table1 WHERE Tengiai='pingtime'", $conn);

(*)Taị nơi quay thưởng, em dùng file update.php để sửa kết quả.Cứ khoảng 20 giây thì xổ số lại quay ra giải mới nên 20 giây kết quả sẽ đựoc update một lần.

File này dùng hàm mysql_query(UPDATE) để update kết quả vào TABLE 1

Code:
$content = stripslashes($_POST['giaidb']);
mysql_query("UPDATE bangketqua set giatri1='$content' WHERE Tengiai='0'", $conn);


$content = stripslashes($_POST['giai1']);
mysql_query("UPDATE bangketqua set giatri1='$content' WHERE Tengiai='1'", $conn);

$content = stripslashes($_POST['giai2_1']);
mysql_query("UPDATE bangketqua set giatri1='$content' WHERE Tengiai='2'", $conn);
$content = stripslashes($_POST['giai2_2']);
mysql_query("UPDATE bangketqua set giatri2='$content' WHERE Tengiai='2'", $conn);

............v.v..........


(*) Website hoạt động rất bình thường nếu có khoảng dưới 200 người online một lúc.

Lúc đầu em dùng SHARED HOST của DREAMHOST.

Nhưng khi con số này tăng lên 400 người, em sử dụng file UPDATE.php để update kết quả thì thấy sau khi bấm vào nút SAVE nó load rất là chậm.

Em tưởng là do server yếu nên đã nâng cấp lên VIRTUAL PRIVATE SERVER (dreamhost) cấu hình 2300MB (230 USD một tháng) nhưng KHÔNG HỀ CÓ tác dụng gì cả.

Vì vậy em nghĩ là do code em làm chưa đúng... bác nào giỏi giúp em với. EM xin cám ơn.

[=========> Bổ sung bài viết <=========]

em nghĩ là do USER READ DABASE LIÊN TỤC nên DATBASE KHÔNG ĐƯỢC FREE vì vậy không ghi đè kết quả lên được nên nó lâu, không biết suy luận của em có đúng không?

Em có nên chia cái TABLE 1 thành nhiều TABLE nhỏ khác nhau không hah các bác???

[=========> Bổ sung bài viết <=========]

Các bác coder xem hộ em nhé, nếu không phải là lỗi do lập trình thì là do cái gì? Liệu có phải do VIRTUAL SERVER yếu quá?

Cái refesh time thì không thể giảm được nữa, cùng lắm là tăng lên 15 giây thôi, 15 giây thì có thể nó chịu được 1000 người online xem một lúc, website em muốn kiếm ra tiền thì phải chịu được mức 2000 - 3000 người cơ các bác ạ.
Thanh duc viết 11:43 ngày 10/10/2018
Nói chung là code tồi !
Sử dụng quá nhiều select, refesh ngay cả khi không cần thiết
Server cùi !
Thử :
Dùng 1 câu lệnh SELECT * FROM table1 duy nhất lấy toàn bộ kết quả rồi dùng PHP hiển thi kết quả theo các giải tương ứng.
Cache dữ liệu khi không quay giải (hoặc ko phải giờ quay thì ko cho refesh)
Từng đó tiền đủ để thuê 1 con server xịn đặt ở VN đường truyền khỏi phải nói . Tạm thế đã
tonvinh viết 11:44 ngày 10/10/2018
Bạn viết như vậy mà 200 người vào 1 lúc mà chạy được là còn đỡ rồi đó.
Một số giải pháp như sau :

1. Gôm các câu select lại thành 1, sử dụng "between" trong đâu select để chỉ gọi 1 lần.
2. Gôm 2 các câu update lại thành 1.
2. Sử dụng transaction để tránh việc xung đột giữa đọc và ghi database.
3. Việc chia nhỏ table là 1 ý tưởng tồi, không nên làm.
4.Sử dụng cache ở để giải quyết vấn đề truy cập nhiều người cùng 1 lúc
namduong8889 viết 11:38 ngày 10/10/2018
cám ơn bác thanh duc và bác tonvinh. Nếu diễn đàn có chức năng thanks em sẽ bấm thanks cho bác.

Để em thử xem, ngoài giờ kết quả em tắt REFRESH đi thì không có vấn đề gì cả.

Tối mai em sẽ báo cáo lại tình hình (thời điểm 7h15 là thời điểm đông nhất nên phải mai mới có kết quả)

p/s: Do DREAMHOST chạy FREE 1 tuần nên em mới dám tăng MEMORY lên 230 USD/mo đấy chứ, giờ em lại hạ xuống 200MB (20 USD/mo rồi)

[=========> Bổ sung bài viết <=========]


1. Gôm các câu select lại thành 1, sử dụng "between" trong đâu select để chỉ gọi 1 lần.
2. Gôm 2 các câu update lại thành 1.
2. Sử dụng transaction để tránh việc xung đột giữa đọc và ghi database.
3. Việc chia nhỏ table là 1 ý tưởng tồi, không nên làm.
4.Sử dụng cache ở để giải quyết vấn đề truy cập nhiều người cùng 1 lúc
__________________
Các bác có tài liệu về các code PHP về những thứ này không cho em xin. Em cám ơn. trình độ PHP & MYSQL của em kém lắm.
bka viết 11:53 ngày 10/10/2018
tại sao bác ý lại có cách làm thế nhỉ..kết quả xổ số chỉ có trong vòng 7h15 --> 7h30 . nên chỉ cho nó refresh trong khoảng thời gian đó..
khi bạn cập nhật kết quả lên thì không có gì. việc đó chỉ có mỗi bạn làm .. khó khăn đặt ra là khi người xử dụng xem kết quả trong thời gian đó..nếu bạn dùng cache trong trường hợp này cũng không hợp lý.. bởi vì kết quả luôn thay đổi và chỉ có truy thẳng vào database mới lấy được sự thay đổi ấy.... cách giải quyết lúc này là trong thời gian cập nhật kết quả bạn hãy lưu các kết quả vào 1 file txt (file này chỉ chiếm dung lượng chưa đến 10k ). và đọc chúng.. sau giờ cao điểm này rùi hãy lưu chúng vào database của bạn ..mình đảm bảo cách này là tối ưu nhất với bạn
namduong8889 viết 11:44 ngày 10/10/2018
Em đã thử rồi bác ạ, file TXT chạy chậm hơn DATABASE nhiều lắm.
bka viết 11:38 ngày 10/10/2018
Được gửi bởi namduong8889
Em đã thử rồi bác ạ, file TXT chạy chậm hơn DATABASE nhiều lắm.
sao chậm được nhỉ.. mình không biết bạn làm như thế nào..

bắt đầu nha:
bình thường vẫn dùng database như thường
đến thời điểm bạn cập nhật giải nhất :
tạo 1 file ketqua.txt lưu giải nhất vào trong đó.
đồng thời chuyển việc lấy dữ liệu từ database sang việc đọc file txt đó (cái này dùng date(); để chuyển)
bắt đầu gọi hàm javascript cho chạy refresh 20 giây 1 lần.

giải 2 lưu tiếp kết quả vào file ketqua.txt..

đến giải đặc biệt .. lưu tiếp kết quả đặc biệt vào file ketqua.txt .. bấm nút submit lúc đó đọc kết quả từ file ketqua.txt lưu vào database.. kết thúc việc gọi javascript để refresh..
chuyển chế độ đọc kết quả về database .. làm trắng file ketqua.txt này đi


kết quả : trong thời gian 7h15 --> 7h30: người xem thực chất là mở file ketqua.txt
quá an toàn .. sao lại chậm hơn được ... database thực sự tối ưu khi dữ liệu bạn lưu vào là lớn.. còn khi dữ liệu chỉ mấy dòng thì nên dùng đọc và ghi vào file đi. tránh làm hao tổn tài nguyên

đợt trước em cũng máu lô đề làm trang này để ngâm cứu .. nhưng lâu rùi không có tiền đánh nên bỏ rùi. http://thugian.name/Xoso/xoso.php?Vl...ate=28-08-2008
đánh lô ảo thui : http://thugian.name/?Vlt=xoso
maruko-nhoc viết 11:47 ngày 10/10/2018
Hê hê, nhắc đến lô đề làm tớ khoái...

Đừng ghi ra TXT, ghi ra HTML luôn đê, không phải đọc database chi ráo.

Đặt luôn quả <meta http-equiv="REFRESH" content="15" /> lên đầu nữa nhá.
setsuna118 viết 11:48 ngày 10/10/2018
Việc chia nhỏ bảng làm trang web chậm đi ko hẳn là đúng. Nhiều cms được dựng ra bằng cách chia nhỏ table theo mô hình quan hệ một cách hợp lý kết hợp với các câu code php mà trang web vẫn có thể nhanh được. Vấn đề để dữ liệu luôn đươc cập nhật:
1. Tạo 1 lớp refresh-rate để refresh trong trường hợp giờ hiện tại đúng trong khoảng yêu cầu, dùng setTimeout để liên tục kiểm tra sau 1 phút 1 lần, nếu đúng trong khoảng thời gian này mới bắt đầu xây dựng việc hiển thị dữ liệu và lúc này mới là lúc refresh 15s 1 lần, nếu quãng time này trôi đi thì dừng việc gọi hàm refresh 15s.
2. HIển thị dữ liệu:
Refresh ở đây nên dùng là ajax vì nó sẽ load lại trang hiện tại mà không cần phải refresh, điều này có thể giảm thiểu thời gian nạp lại trang, để lại 1 div hiển thị và sau mỗi lần đón nhận result từ ajax thay đổi nôi dung innerHTML của nó thôi
3. Phần hiển thị:
Có thể nên dùng phân trang theo ajax nốt vì hiển thị cùng 1 lúc dữ liệu theo kiểu hổ lốn chất đầy lên 1 trang sẽ làm cho trang nạp chậm đi, chúng ta có thể để các kết quá sắp xếp theo 1 vị trí có lợi cho việc người xem muốn xem những dòng nào đầu tiên có thể sắp theo ngày tháng,...Nên nhớ việc xử lý bằng ajax không phải là cứ chất luôn lên trên trang web và khi cần thì lại display, nên dùng cách lúc click vào đâu đó hoặc mouseover thì mới gọi đến request ajax thì sẽ gọn hơn, đừng nên đánh vào nhịp độ khẩn trương của trang web mà phải nghĩ trang web đựoc cập nhật và hiển thị tương đương với tốc độ xem của người đọc (giới hạn việc khóa csdl và bắt đầu truy cập lại)
Bài liên quan
0