Tạo chỉ mục tổng hợp trên postings (is_active, post_date)
(theo thứ tự đó).
Nó sẽ được sử dụng cả để lọc trên is_active
và đặt hàng trước post_date
.
MySQL
nên hiển thị REF
phương thức truy cập qua chỉ mục này trong EXPLAIN EXTENDED
.
Lưu ý rằng bạn có RANGE
điều kiện lọc qua user_offtopic_count
, đó là lý do tại sao bạn không thể sử dụng chỉ mục cho trường này cả khi lọc và sắp xếp theo trường khác.
Tùy thuộc vào mức độ chọn lọc user_offtopic_count
của bạn (i. e. có bao nhiêu hàng thỏa mãn user_offtopic_count < 10
), có thể hữu ích hơn khi tạo chỉ mục trên user_offtopic_count
và để các post_dates được sắp xếp.
Để thực hiện việc này, hãy tạo một chỉ mục tổng hợp trên postings (is_active, user_offtopic_count)
và đảm bảo RANGE
phương pháp truy cập qua chỉ mục này được sử dụng.
Chỉ mục nào sẽ nhanh hơn phụ thuộc vào việc phân phối dữ liệu của bạn. Tạo cả hai chỉ mục, FORCE
chúng và xem cái nào nhanh hơn:
CREATE INDEX ix_active_offtopic ON postings (is_active, user_offtopic_count);
CREATE INDEX ix_active_date ON postings (is_active, post_date);
SELECT
`postings`.`id`,
UNIX_TIMESTAMP(postings.post_date) as post_date,
`postings`.`link`,
`postings`.`title`,
`postings`.`author`,
`postings`.`excerpt`,
`postings`.`long_excerpt`,
`feeds`.`title` AS feed_title,
`feeds`.`website` AS feed_website
FROM
`postings` FORCE INDEX (ix_active_offtopic)
JOIN
`feeds`
ON
`feeds`.`id` = `postings`.`feed_id`
WHERE
`feeds`.`type` = 1 AND
`postings`.`user_offtopic_count` < 10 AND
`postings`.`is_active` = 1
ORDER BY
`postings`.`post_date` desc
LIMIT
15
/* This should show RANGE access with few rows and keep the FILESORT */
SELECT
`postings`.`id`,
UNIX_TIMESTAMP(postings.post_date) as post_date,
`postings`.`link`,
`postings`.`title`,
`postings`.`author`,
`postings`.`excerpt`,
`postings`.`long_excerpt`,
`feeds`.`title` AS feed_title,
`feeds`.`website` AS feed_website
FROM
`postings` FORCE INDEX (ix_active_date)
JOIN
`feeds`
ON
`feeds`.`id` = `postings`.`feed_id`
WHERE
`feeds`.`type` = 1 AND
`postings`.`user_offtopic_count` < 10 AND
`postings`.`is_active` = 1
ORDER BY
`postings`.`post_date` desc
LIMIT
15
/* This should show REF access with lots of rows and no FILESORT */