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

Tối ưu hóa hiệu suất MySQL:thứ tự theo trường datetime

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 */


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dịch vụ mysql không khởi động được / bị treo - hết thời gian chờ (Ubuntu, MariaDB)

  2. MySQL khớp các ký tự unicode với phiên bản ascii

  3. Có an toàn khi so sánh các chuỗi với 'lớn hơn' và 'nhỏ hơn' trong MySQL không?

  4. Tầm quan trọng của WHERE 1 trong các truy vấn MySQL

  5. Kết nối từ xa với cơ sở dữ liệu MySQL