10/10/2018, 13:21

Tối ưu khi SELECT từ nhiều bảng có số record lớn

Mình dùng câu lệnh trên để lấy ra toàn bộ thông tin bài viết và tên người post bài, nhưng khi bảng posts lên đến gần 100k thì xử lý chậm quá. Các anh em xem có giải pháp nào hay chỉ cho mình với

Code:
Mình post câu SQL mà nó cứ báo là link, không cho post :|, các bạn vui lòng xem câu lệnh ở chỗ lý do sửa nhé :(
trannamcn viết 15:26 ngày 10/10/2018
Dùng inner join cải thiện thêm 1 chút đi bác ơi

- - - Updated - - -

Dùng inner join cải thiện thêm 1 chút đi bác ơi
izal viết 15:21 ngày 10/10/2018
Vẫn thế bác ah ............
tuine2334 viết 15:31 ngày 10/10/2018
Thêm SELECT TOP n gì đó cũng hay đấy bác. Nếu không cần hiển thị hết

- - - Updated - - -

Thêm SELECT TOP n gì đó cũng hay đấy bác. Nếu không cần hiển thị hết
trannamcn viết 15:31 ngày 10/10/2018
Được gửi bởi izal
Vẫn thế bác ah ............
Bác nói ra yêu cầu mục đích để anh em cùng nhau tối ưu. Chứ lấy ra hết làm gì cho nó cực DB :v

- - - Updated - - -

Được gửi bởi izal
Vẫn thế bác ah ............
Bác nói ra yêu cầu mục đích để anh em cùng nhau tối ưu. Chứ lấy ra hết làm gì cho nó cực DB :v

- - - Updated - - -

Được gửi bởi izal
Vẫn thế bác ah ............
Bác nói ra yêu cầu mục đích để anh em cùng nhau tối ưu. Chứ lấy ra hết làm gì cho nó cực DB :v
izal viết 15:22 ngày 10/10/2018
Em cũng limit phân trang rồi. Sau 1 hồi ngồi test em thấy nó chậm ở chỗ join 2 bảng và order
trannamcn viết 15:36 ngày 10/10/2018
Thế thì bạn tách làm 2 query
- Query 1 ở bảng post có phân trang
- Query 2 ở bảng user điều kiện là USERID = ( dữ liệu lấy từ query 1 ) xuống duyệt = vòng lặp

--> Như thế 2 bảng không bị đem trộn với nhau và tăng hiệu suất

- - - Updated - - -

Thế thì bạn tách làm 2 query
- Query 1 ở bảng post có phân trang
- Query 2 ở bảng user điều kiện là USERID = ( dữ liệu lấy từ query 1 ) xuống duyệt = vòng lặp

--> Như thế 2 bảng không bị đem trộn với nhau và tăng hiệu suất
izal viết 15:26 ngày 10/10/2018
Được gửi bởi trannamcn
Thế thì bạn tách làm 2 query
- Query 1 ở bảng post có phân trang
- Query 2 ở bảng user điều kiện là USERID = ( dữ liệu lấy từ query 1 ) xuống duyệt = vòng lặp

--> Như thế 2 bảng không bị đem trộn với nhau và tăng hiệu suất

- - - Updated - - -

Thế thì bạn tách làm 2 query
- Query 1 ở bảng post có phân trang
- Query 2 ở bảng user điều kiện là USERID = ( dữ liệu lấy từ query 1 ) xuống duyệt = vòng lặp

--> Như thế 2 bảng không bị đem trộn với nhau và tăng hiệu suất
Ok thanks bác để em thử!
trannamcn viết 15:26 ngày 10/10/2018
Được gửi bởi izal
Như thế giả sử em lấy 1 trang 20 bài thì mất 21 query, liệu có tăng không bác :|
Tăng chứ bác --> Đang tận dụng index mà --> Không biết SQL Server nó thông minh cỡ nào nhưng nếu mà 21 so với ~100k query thì bác thấy cái nào chậm hơn ?

- - - Updated - - -

Được gửi bởi izal
Như thế giả sử em lấy 1 trang 20 bài thì mất 21 query, liệu có tăng không bác :|
Tăng chứ bác --> Đang tận dụng index mà --> Không biết SQL Server nó thông minh cỡ nào nhưng nếu mà 21 so với ~100k query thì bác thấy cái nào chậm hơn ?
trinhdiep viết 15:28 ngày 10/10/2018
sao không dùng procedure
create procedure posts_page(@page int)
begin
select * into @temp from posts order by add_time desc limit @page,10;
select * into @users from members where USERID in(select USERID from @temp);
select A.*,B.username from @temp as A inner join @users as B where A.USERID=B.USERID;
end;

- - - Updated - - -

sao không dùng procedure
create procedure posts_page(@page int)
begin
select * into @temp from posts order by add_time desc limit @page,10;
select * into @users from members where USERID in(select USERID from @temp);
select A.*,B.username from @temp as A inner join @users as B where A.USERID=B.USERID;
end;

- - - Updated - - -

sao không dùng procedure
create procedure posts_page(@page int)
begin
select * into @temp from posts order by add_time desc limit @page,10;
select * into @users from members where USERID in(select USERID from @temp);
select A.*,B.username from @temp as A inner join @users as B where A.USERID=B.USERID;
end;
Bài liên quan
0