Mysql
 sql >> база данни >  >> RDS >> Mysql

Оптимизиране на производителността на MySQL:подреждане по поле за дата и час

Създайте съставен индекс или за postings (is_active, post_date) (в този ред).

Ще се използва както за филтриране на is_active и подреждане по post_date .

MySQL трябва да показва REF метод за достъп през този индекс в EXPLAIN EXTENDED .

Имайте предвид, че имате RANGE условие за филтриране над user_offtopic_count , ето защо не можете да използвате индекс върху това поле както при филтриране, така и при сортиране по друго поле.

В зависимост от това колко избирателен е вашият user_offtopic_count (т.е. колко реда отговарят на user_offtopic_count < 10 ), може да е по-полезно да създадете индекс на user_offtopic_count и нека post_dates да бъдат сортирани.

За да направите това, създайте съставен индекс за postings (is_active, user_offtopic_count) и се уверете, че RANGE използва се метод за достъп до този индекс.

Кой индекс ще бъде по-бърз зависи от разпределението на вашите данни. Създайте и двата индекса, FORCE ги и вижте кое е по-бързо:

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. Обновяването на MySQL отнема (твърде) много време

  2. MySQL пълно текстово търсене в множество таблици

  3. Разрешаване на изпълнението на множество оператори по време на изпълнение чрез sqlalchemy

  4. Променете таблицата, ако съществува, или създайте, ако не съществува

  5. Конкатениране на записи в една колона без цикъл?