10/10/2018, 11:10
Giúp đỡ tối ưu MySQL Query
mình gặp 1 bài toán truy vấn mysql SQL sau:
lấy 3 row kế tiếp trong csdl
vd đánh chỉ số 1 2 3 4 5
chọn 4 thì lấy row 5 1 2
chọn 5 thì 1 2 3
chọn 2 thì 3 4 5
hiện tại mình đã giải quyết dc vấn đề nhưng code dài đến 4 dòng, chứa đến 4 COUNT(*) vậy ae nào gặp phải trường hợp này có cách nào giải tốt hơn mà ko dùng đến PHP thì giúp mình với. xin cám ơn
lấy 3 row kế tiếp trong csdl
vd đánh chỉ số 1 2 3 4 5
chọn 4 thì lấy row 5 1 2
chọn 5 thì 1 2 3
chọn 2 thì 3 4 5
hiện tại mình đã giải quyết dc vấn đề nhưng code dài đến 4 dòng, chứa đến 4 COUNT(*) vậy ae nào gặp phải trường hợp này có cách nào giải tốt hơn mà ko dùng đến PHP thì giúp mình với. xin cám ơn
Bài liên quan
1.query 1 : select id from table where id > a order by id asc limit 3
2.count(result) lấy ra số dữ liệu còn thiếu B
3. query 2 : select id from table order by id asc limit B
4. ghép 2 mảng lại.
tối ưu hay ko còn phụ thuộc vào khung cảnh thực tế, tạm thời mình chỉ nghĩ simple là zị.
Còn trong vấn đề của mình là DESC và đây là table của mình
item_id item_catid
1-------8
2-------8
3-------8
4-------8
5-------8
7-------10
_ khi mà chọn item_id 4 thì show ra các record có item_id là 3 2 1
_ khi chọn item_id 2 thì show ra các record có item_id là 1 5 4
_ item_id=1 thì show ra các record có item_id là 5 4 3
vậy code sau của mình ko tối ưu chỗ nào vậy các bạn
$item_id = 2;
$item_catid = 8;
$limit = 3;
WHERE
item_id < $item_id AND item_catid = $item_catid
ORDER BY item_id DESC)
UNION
(SELECT * FROM ((SELECT * FROM shop_product_item ORDER BY item_id DESC) as tb1)
WHERE
item_catid = $item_catid LIMIT 0,$limit)
LIMIT 0,$limit
1) lấy 3 row có id > X
2) lấy nốt 1 or 2 row ở đầu bản NẾU câu lệnh 1) ko trả về đủ 3 row
Điều quan trọng nhất tôi muốn nói ở đây là khi optimize query bạn phải hiểu rõ cách mà csdl sẽ thực hiện từng câu lệnh của bạn. Thà dùng nhiều câu lệnh đơn giản mà bạn hiểu còn hơn dùng ít câu lệnh mà bạn ko hiểu rõ. Bởi performance của chúng có thể tốt lúc này, nhưng khi db lớn hơn thì performance lại degrade.
Quay lại câu lệnh "(SELECT * FROM table WHERE id>4) UNION (SELECT * FROM table LIMIT 0,3) LIMIT 0,3" - khi hiểu rõ vấn đề, bạn chỉ cần thêm LIMIT 3 vào vế đầu thì câu lệnh này cũng sẽ đc optimize (chạy hiệu quả & performance ko degrade over time)!
Tất cả những câu lệnh tôi đưa ra không bao giờ tròn trịa đến mức có thể "plug and play" cả (thậm chí có khi còn sai cả cú pháp). Cho nên việc performance hay optimize gì tôi chả quan tâm, mục đích chính của câu trả lời là hướng người hỏi đến từ khóa UNION. Nếu hiểu ý nghĩa nó rồi thì việc "điều khiển" nó theo ý mình là không có gì khó. Còn nếu cứ bê nguyên xi vào sử dụng mà không hiểu thì thà đừng sử dụng còn hơn.
Và tôi cũng không nghĩ UNION 2 câu query sẽ performance kém hơn việc gọi 2 câu query riêng lẻ. Vấn đề là câu query như thế nào mà thôi.