Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Optymalizacja wydajności MySQL:kolejność według pola daty i godziny

Utwórz indeks złożony w postings (is_active, post_date) (w tej kolejności).

Będzie używany zarówno do filtrowania po is_active i zamawianie do post_date .

MySQL powinien pokazać REF metoda dostępu przez ten indeks w EXPLAIN EXTENDED .

Pamiętaj, że masz RANGE filtrowanie warunku przez user_offtopic_count , dlatego nie można używać indeksu nad tym polem zarówno do filtrowania, jak i sortowania według innych pól.

W zależności od tego, jak selektywny jest Twój user_offtopic_count (tj. ile wierszy spełnia user_offtopic_count < 10 ), bardziej przydatne może być utworzenie indeksu na user_offtopic_count i niech post_daty zostaną posortowane.

Aby to zrobić, utwórz indeks złożony dla postings (is_active, user_offtopic_count) i upewnij się, że RANGE używana jest metoda dostępu przez ten indeks.

To, który indeks będzie szybszy, zależy od dystrybucji danych. Utwórz oba indeksy, FORCE je i zobacz, co jest szybsze:

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. alternatywa dla mysql_field_name w mysqli

  2. Zapytania w obrębie długości i szerokości geograficznej w MySQL

  3. Jak przekonwertować DateTime na liczbę w MySQL?

  4. SELECT id HAVING maksymalna liczba identyfikatorów

  5. Dopasowanie ciągu zapytania MySQL SELECT