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

mysql - Tối ưu hóa ĐẶT HÀNG BẰNG THAN trên cột bảng đã tham gia

Vấn đề ở đây như tôi đã mô tả trong bản cập nhật 2 của câu hỏi của tôi. MySQL sử dụng các chỉ mục để thực hiện các thao tác ORDER BY một cách nhanh chóng. Cụ thể hơn, MySQL sử dụng B-tree để lập chỉ mục các cột (chẳng hạn như dấu thời gian - p.time / r.time), sử dụng nhiều dung lượng hơn một chút nhưng cho phép sắp xếp nhanh hơn.

Vấn đề với truy vấn của tôi là nó đang sắp xếp theo cột thời gian trong hai bảng, sử dụng dấu thời gian từ bảng đăng lại nếu có và bảng đăng nếu không. Vì MySQL không thể kết hợp các cây B từ cả hai bảng nên nó không thể thực hiện sắp xếp chỉ mục nhanh trên các cột từ hai bảng khác nhau.

Tôi đã sửa đổi truy vấn và cấu trúc bảng của mình theo hai cách để giải quyết vấn đề này.

1) Thực hiện lọc dựa trên người dùng bị chặn trước, vì vậy việc đặt hàng chỉ phải được thực hiện trên các bài đăng mà người dùng hiện tại có thể truy cập. Đây không phải là gốc rễ của vấn đề, nhưng là tối ưu hóa thực tế. ví dụ:

SELECT * FROM (SELECT * FROM Post p WHERE p.author_id NOT IN (4, 5, 6...))...

2) Coi mọi bài đăng như một bài đăng lại của tác giả, vì vậy mỗi bài đăng được đảm bảo có thời gian đăng lại và đăng lại có thể kết hợp để lập chỉ mục và sắp xếp. ví dụ:

SELECT * FROM (...) LEFT JOIN p.reposts repost ON (p.id = repost.post_id AND 
repost.time = (
  SELECT MIN(r.time) FROM Repost r WHERE p.id = r.post_id
  AND r.user_id IN (1, 2, 3...) AND r.user_id NOT IN (4, 5, 6...))
))
WHERE (repost.id IS NOT NULL) ORDER BY repost.time DESC LIMIT 0, 10

Vào cuối ngày, vấn đề đã đến với ORDER BY - cách tiếp cận này đã giảm thời gian truy vấn từ khoảng 8 giây xuống còn 20 mili giây.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tìm nạp bản ghi đầu tiên và cuối cùng của bản ghi được nhóm trong truy vấn MySQL với các hàm tổng hợp?

  2. PHP 7 RC3:Cách cài đặt MySQL PDO bị thiếu

  3. Các giá trị json trong MySQL SUM được nhóm bằng các khóa json

  4. Trừ một số ngày và giờ cho ngày và giờ hiện tại để tìm tuổi trong PHP

  5. MySQL:Sao chép cơ sở dữ liệu MySQL trên cùng một phiên bản MySql