Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cache / Sử dụng lại một truy vấn con trong MySQL

Xem những gì EXPLAIN EXTENDED nói.

Nếu nó cho biết DEPENDENT SUBQUERY hoặc UNCACHEABLE SUBQUERY , sau đó nó sẽ được đánh giá lại mỗi khi được sử dụng.

Điều này xảy ra nếu truy vấn con sử dụng các biến phiên hoặc là một truy vấn con có tương quan.

Nếu không, nó có thể sẽ được lưu vào bộ nhớ đệm.

Nếu trường hợp của bạn, truy vấn con sẽ không được lưu vào bộ nhớ đệm, nó sẽ được đánh giá lại trong mỗi UNION 'ed set.

Tuy nhiên, truy vấn con của bạn dường như quá phức tạp. Tại sao bạn không sử dụng:

SELECT id
FROM   playlist_program_map ppm, programs p
WHERE  ppm.playlist_id = 181
       AND p.id = ppm.program_id
       AND submitter_id = 32
       AND feed_id = 2478

Nếu bạn có chỉ mục trên playlist_program_map (playlist_id) , truy vấn này sẽ hoạt động giống như một sự quyến rũ.

Bạn có thể vui lòng cho tôi biết thêm hai điều:

  1. Có bao nhiêu hàng trong playlist_program_map và có bao nhiêu DISTINCT playlist_id có giá trị nào không?
    • Có bao nhiêu hàng trong programs và có bao nhiêu DISTINCT submitter_id, feed_id có cặp không?

Từ nhận xét của bạn, tôi có thể kết luận rằng có 10 programs mỗi playlist trung bình và 200 programs per (submitter, feed) đôi. Điều này có nghĩa là chỉ mục của bạn trên playlist_program_map được lựa chọn nhiều hơn so với trên (submitter, feed)playlist_program_map phải dẫn đầu tham gia.

Chỉ mục toàn văn bản trong trường hợp của bạn dường như cũng không được chọn lọc cho lắm, vì bạn cần phải tham gia 10 chương trình trong số 2.000.000 .

Tốt hơn bạn có thể thử những cách sau:

SELECT object_id, programs.created AS created
FROM   playlist_program_map ppm, programs p, comments_programs cp
WHERE  ppm.playlist_id = 181
       AND p.id = ppm.program_id
       AND p.submitter_id = 32
       AND p.feed_id = 2478
       AND cp.object_id = p.id
       AND cp.text REGEXP 'excellent'

và lặp lại điều này cho cả ba bảng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Cột thời gian hiện tại tự động chèn

  2. Lỗi cú pháp trên MYSQL Trigger

  3. Cài đặt gem mysql2 trên Mac OS x Lion

  4. Bắt org.hibernate.TransactionException:lỗi giao dịch lồng nhau không được hỗ trợ khi xóa

  5. Phát ra tất cả các tên trường cùng với các giá trị tương ứng của chúng