Có bài cũ này cụ check xem Code: https://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/
Thế là vấn đề cụ chưa config cái mysql rồi [mysqld] sort_buffer_size = 100M tăng giá trị lên rồi test xem
Haha chứ còn gì nữa để tư vấn. Nếu được bác gửi mình bản dump của database và hide hết dữ liệu, fake name đi, mình test thử phát.
@money : Mạo muội trả lời bác như sau: Khi có điều kiện Where và order by thì mysql sẽ sử dụng index ưu tiền where trước và order by sau. Nếu where của bác là search theo full text search của column Name thì index cho các cột khác gần như vô nghĩa. Trừ khi bác Where theo mấy điều kiện Field 1-> 5 kia thì mới dùng index được.
Giải quyết rồi nhé các bác. Thêm vào câu query chút xíu: select id, name from news FORCE INDEX (id) where (blah blah ...) ORDER BY id DESC LIMIT 100 Nhanh như điện kakaka Cám ơn anh em đã dành thời gian support. @Luxifer muốn test thì dễ mà, bác cứ tạo 1 table cấu trúc như mình đã post, insert vào field name tầm 20K rows dạng: this is row with name luxifer 1 this is row with name luxifer 2 ... this is row with name luxifer 20000 Sau đó bác search like hay match ... against trên field name có value là 'luxifer' (nhớ so sánh khi có Order By ID và không có) là thấy ngay, không cần đến hàng chục M rows đâu. @Mr.BTD cám ơn Mod đã quan tâm @Phan Thị đã tăng buffer lên 256M luôn nhưng chỉ nhanh hơn xíu @tombong đúng rồi, chính vì mình hiểu là nó Where trước rồi mới Order nhưng không nghĩ là nó Order trên 1 field đã có Index mà lại chậm như thế (hơi ngạc nhiên vì cơ chế nó ngu ngu ) Dù sao thì cũng giải quyết xong rồi. @Zép Xanh quên Andy đi bé ạ, giờ chỉ còn money với Sói thôi, anh nào cũng đẹp trai @Nai anh không cãi với bé
Chưa kịp đọc bác ạ Lúc chiều đang làm thì vợ gọi lên xong mệt quá ngủ xíu đi đón con, giờ mới ngồi vào máy làm dc tí
Thank @Phan Thị mình mới đọc cái link đó, nó cũng thêm FORCE INDEX Nhưng cách cuối của nó tối ưu quá mà ko áp dụng được trong trường hợp này vì mình có Where nữa. Ý tưởng của nó là lấy 10 cái ID cuối ra rồi join table để lấy các giá trị của field khác. Nhưng 10 ID cuối chưa chắc đã thỏa mệnh đề Where của mình nên ko áp dụng được. Còn nếu thêm Where vào đó thì chẳng có ý nghĩa gì nữa, dùng luôn FORCE INDEX cho nhanh. Copy lại link cho anh em nào cần xem, khỏi tìm: Code: https://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/
Haizzz ... Test từ đêm qua đến giờ thì thấy nó không ổn định các bác ạ. Thỉnh thoảng nó vẫn rất chậm, nhất là khi dùng Where match(name) against('find string' in boolean mode) với find string có 4-5 words trở lên (find string 1-2 words cũng có khi chậm nhưng tỉ lệ ít hơn) Thôi khó quá thì bỏ, dành time làm việc khác