Truy vấn database n lần và truy vấn 1 lần với WHERE = array[n] cái nào nhanh hơn và nhẹ nhàng cho host hơn?

Như tiêu đề mình đang thắc mắc không biết nên truyền truy vấn qua php tới dtb n lần gọi từ C# hay gọi 1 lần với WHERE = (‘n phần tử’) sẽ nhanh hơn và cái nào hót làm việc nhẹ hơn?

  • Mỗi lần gọi sẽ tạo kết nối mới? Hay gọi tất cả trong 1 kết nối?
  • Truy vấn liên tiếp hay lần lượt và (thời gian) cách xa nhau?

Tùy trường hợp. Nếu truy vấn liên tiếp (vòng lặp) thì nên mở kết nối 1 lần và chỉ 1 lệnh truy vấn.

3 Likes

Luôn luôn hạn chế tối đa số truy vấn.

3 Likes

Là mình chạy link trỏ tới file php để lấy dữ liệu với select. Mình tay ngang nên ko nói đúng ngôn ngữ chuyên ngành bạn thông cảm. Nhưng vấn đề mình muốn hỏi chắc bạn hiểu chứ?

Cụ thể ví dụ mình muốn lấy một mảng {TÊN, TUỔI} từ cột TÊN, TUỔI với $_POST[“ID”];
Mình truyền ID vào từ C# tới cùng 1 file php để lấy dữ liệu về C#.
Và mình đang thắc mắc nên dùng vòng lặp ở C# truyền từng ID vào liên tiếp nhau (mỗi lần sẽ tạo 1 kết nối) để lấy cho đủ danh sách mình cần. Hay mình nên gọi một kết nối và truyền vào cả mảng ID cùng lúc để lấy dữ liệu ra?
Với bảng mình có gần trăm nghìn dòng và cần gọi ra khoảng 30 - 50 dòng (30-50 ID). ID là key chính.
Và mình muốn hỏi thêm có nên dùng luôn SORT BY khi truy vấn không hay để C# sort với dữ liệu thô? Ý mình là lệnh SORT BY đó có khiến lấy dữ liệu ra chậm đi nhiều đến mức nào?

  • Chạy hết 1 vòng lặp, build thành 1 câu query, gởi lên DB server 1 lần. Lưu ý độ dài tối đa của câu query bị giới hạn bởi từng loại csdl.
  • SORT: để cho DB làm. Sort đương nhiên là chậm + tốn tempdb, tuy nhiên nó vẫn làm tốt hơn nhiều lần so với bạn tự code.
3 Likes

MySQL có hỗ trợ cái gọi là EXPLAIN statement. Bạn sử dụng cái đó để “đo đếm” các câu query của bạn nhằm biết cái nào tốt hơn cái này nhé. Nếu sau khi đo đếm chán rồi mà không biết làm gì nữa thì bắt đầu nghiên cứu tới cái gọi là scalability.

Mà cũng không hiểu luôn là dùng C# để gọi PHP thi hành thì lúc này bạn có quản lý luôn PHP Script kia không? PHP Script nó nhận tham số POST / GET vào như thế nào? Nếu mỗi lần nó chỉ nhận đúng 1 ID gì đó tương ứng với 1 câu query thì truyền cả mảng vào không có tác dụng gì hết, nó không thèm chạy. Còn nếu nó cho phép truyền cả mảng, bạn còn phải xem thử cấu hình nó bộ nhớ bao nhiêu. Có khi nó lăn đùng ra chết mất tiêu thì tưởng nhanh lại hóa chậm.

3 Likes

Cảm ơn bạn đã cung cấp thêm rất nhiều kiến thức cho mình.
Mình quản lý PHP file của mình như này, và một table User với các cột ID, Name, Level, Score, … (3, 4 cột khác không liên quan)

Nếu truyền vào từng ID một ID có dạng 2588031234566666 (cách này mình đang dùng)

$servername = "";
$username = "";
$password = "";
$dbName = "";

$id = $_POST["ID"];

$conn = new mysqli($servername, $username, $password, $dbName);
//Check connection
if(!$conn){
    die("Connection failed. ". mysqli_connect_error());
}

$sql = "SELECT Name, Level, Score FROM User WHERE ID = ".$id;

$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result) > 0){
    //show data for each row
    while($row = mysqli_fetch_assoc($result)){
        $rows[] = $row;
    }
    echo json_encode($rows);
} else{
    echo "Id is not avalable!!!!";
}
$conn->close();

Còn nếu truyền vào mảng ID thì mình sẽ sửa thành

$sql = "SELECT Name, Level, Score FROM User WHERE ID IN ($id) ORDER BY Level DESC";

nếu truyền cả mảng thì $_POST[“ID”] với ID truyền vào sẽ có dạng

'2588031234566666', '25880123456789838', '1000000000002555', '1454645215445451', '15764541548785452', '12545432516435553'

sẽ khoảng 20 -30 ID cơ

Và trong ngày người dùng cần truy vấn cái này rất nhiều do nó là để load friend list của từng người dùng. vì vậy mình rất quan tâm tới việc liệu server làm việc theo cách nào sẽ tốt hơn?
mong bạn cho mình biết những lưu ý cần thiết hay tài liệu nào sẽ giúp ích cho mình.

Vì nếu để truy vấn có SORT BY thì mình sẽ đặt INDEX cho cột Level mà cột đó cũng thường xuyên UPDATE nên để INDEX thì UPDATE sẽ chậm còn nếu truy vấn từng ID một thì mình ko để INDEX để UPDATE nhanh hơn. Mình biết là truyền vào truy vấn 1 lần lấy ra được cả danh sách đã xắp xếp sẽ tiện cho công việc nhưng mình ko biết đánh đổi lại là server làm việc nặng hơn có gây ra vấn đề lớn ko khi bảng nhiều data hơn không. Host mình đang dùng là share host giá rẻ.

Có 20-30 id thì khỏi cần order by cũng đc, đẩy hết về client rồi cho client nó sort…

cứ xài in chạy 1 lần xài for nhiều lần làm gì :V Đừng order by làm gì thêm gánh nặng cho host yếu, cứ để client nó xử lý, thích sort theo name hay level hay score gì tùy ý. Tội gì host phải sort cả ngàn lần trong khi client có thể sort 20-30 user nhẹ nhàng :V client là code chạy trên máy của người sử dụng ấy.

3 Likes

Tóm lại là tìm trong bảng một lần vẫn đỡ hơn là tìm cũng bảng đó N lần. Các độ trễ kết nối, mở db, chạy script cũng nhân lên N lần trên cả server và client.

1 Like

20-30 ID thì làm thế nào cũng đc khỏi nghĩ

Thử thế này nhé chủ topic:
Không có order by gì hết, chỉ select thông thường thôi nhé. Và dùng WHERE ID IN ($id) để chỉ gọi một lần thôi. Nhưng tất nhiên là WHERE ID IN ($id) sẽ chạy chậm hơn là chỉ select duy nhất 1 ID. Nhưng mỗi lần bạn chỉ lấy có 30 ID thì không chậm lắm đâu, cho dù có cả ngàn user cùng query, bạn chỉ cần thiết kế table với engine là MyISAM nhé, đừng để InnoDB vì MyISAM tốt cho select hơn, ít bị nghẽn cổ chai do đọc đĩa quá nhiều.

Vậy nếu không ORDER BY thì làm thế nào? Xử lý ở phía client khi nhận được JSON thì sắp xếp dựa trên đó, hiện nay các trình duyệt xử lý JavaScript rất mạnh nên vài chục dòng nó làm nhanh đến mức người dùng hầu như không thấy lag liếc gì.

4 Likes

Cảm ơn anh em đã truyền công lực.
Cảm ơn Vô Thin
Cảm ơn tntxtnt, Hai Lúa, SITUVN, trần hoàn, Đào Anh, ropp và tất cả anh em.

Bác cho mình hỏi tí mình đang làm một webapp trong đó có chức năng sort theo họ, họ trùng theo tên, tên trùng theo tên đệm, trùng nữa thì theo ngày gia nhập, chức năng sort như vậy theo bác mình nên xử lý ở database hay xử lý bên sever, bên sever mình chưa biết xử lý sort như nào cho hợp lý vì kq trả về là một tập hợp arrays in array

Mình hông rõ bạn chỉ giải quyết hậu quả của ai đó để lại hay cái của bạn là đang làm và đang băn khoăn xử lý ở client hay server sẽ hiệu quả hơn nên khó nói được. Vậy thì mình khuyên cách chơi ngu hơn nè: xử lý khi nhập liệu nhé, ngay khi nhập liệu là kiểm tra xem, lúc này tất nhiên là kiểm tra ở phía server rồi.

Trước khi insert vào database ta kiểm tra ngay, chỉ xử lý đúng 1 biểu ghi đang cần lưu vào DB thì không nặng đâu (cùng lăm 100 người online cùng lúc cho một web thông thường - còn nhiều hơn thì đã không hỏi ở đây :D). Nhiều người sử dụng CSDL quan hệ nhưng lại không bao giờ hiểu bản chất của nó là gì: là hạn chế trùng lắp dữ liệu, nếu cho phép trùng thì nên chọn loại CSDL khác.

Một khi dữ liệu đầu vào không trùng thì đầu ra khỏe cho việc kiểm tra kia. Chỉ cần chỉnh collation cho đúng ngôn ngữ cần sort rồi query với ORDER BY nó sẽ ra thứ tự. Ví dụ luôn: https://superthinlabs.com/tat-ca-bai-viet (tự nó đúng từ điển tiếng Việt).

3 Likes

Sr mình Không hiểu câu trả lời của bạn lắm, sort tiếng việt thì mình sort theo colate utf8 vietnamese thì lúc nào cũng đúng rồi. Sort ngay lúc vào thì không được, vì có trường hợp sẽ sort theo lá phiếu, trường hợp alphabet, trường hợp theo năm sinh. Mình chỉ hỏi có cách nào sort nhiều điều kiện với nhiều mảng một lúc bằng php hay không? Hay đều phải xử lý trpng mysql

Mình cũng không hiểu ý bạn luôn.

Mình chỉ muốn nói về cách tiếp cận vấn đề chung để bạn tránh hấp tấp làm mà không biết đang làm gì để rồi tưởng nhanh hóa ra lại hỏng:

  • Bạn cần làm rõ bài toán sort của bạn để bạn biết rằng nên xử lý nó với ngôn ngữ SQL hiệu quả hơn hay dùng ngôn ngữ lập trình hiệu quả hơn và bạn cũng biết làm nữa (có người rất kém về SQL, join các table không được).

  • Làm rõ việc đó phía client hiệu quả hơn hay phía server hiệu quả hơn, có cái nào cần cache lại dùng suốt phiên làm việc để giảm tải server hay không.

  • Ngoài sắp xếp theo tự điển được trang bị sẵn, SQL đã hỗ trợ thì có loại sắp xếp nào không có sẵn, cần phải lập trình rắc rối?

  • Sắp xếp theo ký tự text liệu có thể chuyển sang sắp xếp binary mà không ảnh hưởng gì không để tăng tốc độ lên chút chút?

  • Ứng dụng có cần chức năng real-time hay không? (Ví dụ cụ thể: có người thay đổi dữ liệu mà dữ liệu hiển thị ở màn hình người khác thì nó cũng hay đổi theo như trên Google Docs hay bản tin chứng khoán).

  • Thực ra bài toán đang giải là sắp xếp hay so sánh, việc trùng dữ liệu có ý nghĩa như thế nào? Nếu CSDL không trang bị thì tự viết extension cho hệ quản trị cơ sở dữ liệu hay xử lý trên web app :smiley:

Nếu những thứ trên làm bạn mất kiên nhẫn mà chỉ muốn sắp xếp họ và tên thì tại sao bạn không concate họ + đệm + tên = tên hoàn chỉnh thành một chuỗi và sắp xếp theo chuỗi đó đỡ phải query tới lui chả để làm gì.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?