[Hỏi] Thứ tự sắp xếp trong kết quả truy vấn MySQL

Discussion in 'Hỏi Đáp Kỹ Thuật' started by money, Oct 12, 2017.

  1. Phan Thị

    Phan Thị Bang Chúng

    Có bài cũ này cụ check xem
    Code:
    https://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/
     
    money likes this.
  2. Phan Thị

    Phan Thị Bang Chúng

    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
     
  3. Luxifer

    Luxifer Sơ Nhập Giang Hồ


    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.
     
  4. tombong

    tombong Khách Qua Đường

    @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.
     
  5. Mr.BTD

    Mr.BTD Moderator Staff Member

    @money : Admin Sói hỏi câu hỏi vừa hay vừa khó, không biết trả lời :(
     
  6. money

    money Hương Chủ

    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 :D

    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 ) 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é {hehe}{hehe}{hehe}
     
    Last edited: Oct 12, 2017
    EDM, Nai and Zép Xanh like this.
  7. Phan Thị

    Phan Thị Bang Chúng

    Bác có dùng cái link mình gửi không @money
     
  8. money

    money Hương Chủ

    Chưa kịp đọc bác ạ :D 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í :D
     
  9. money

    money Hương Chủ

    Thank @Phan Thị mình mới đọc cái link đó, nó cũng thêm FORCE INDEX :D
    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/
     
  10. money

    money Hương Chủ

    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 :D
     
  11. cafemmo

    cafemmo Tân Thủ Thôn

    Anh @Sói đẹp giai đi nhậu về là làm được á. Lâu lắm rồi mới thấy ca khó làm pó tay mọi người thế này {shoot1}{shoot1}{shoot1}{shoot1}{shoot1}