Tôi đã tự tìm ra câu trả lời, phải tách truy vấn thành nhiều truy vấn con.
SELECT
mq.*,
@indexer := @indexer + 1 AS indexer
FROM
(
SELECT
p.id,
p.tag_id,
p.title,
p.created_at
FROM
`posts` AS p
LEFT JOIN
`votes` AS v
ON p.id = v.votable_id
AND v.votable_type = "Post"
AND v.deleted_at IS NULL
WHERE
p.deleted_at IS NULL
GROUP BY
p.id
) AS mq
JOIN
(SELECT @indexer := 0) AS i
Rõ ràng, điều đó đã gây ra số lượng lớn các hàng được truy cập cho truy vấn (theo EXPLAIN
), nhưng cũng cố gắng khắc phục điều đó với các chỉ số bổ sung. Câu trả lời đầy đủ cho vấn đề đó có thể được tìm thấy tại đây: Tính toán các chỉ số hàng với truy vấn con có các phép nối, kết quả là các hàng được kiểm tra A * B