sql >> Databáze >  >> RDS >> Mysql

Optimalizace výkonu MySQL:pořadí podle pole data a času

Vytvořte složený index buď na postings (is_active, post_date) (v tomto pořadí).

Bude použit pro filtrování is_active a objednání do post_date .

MySQL by měl zobrazovat REF přístupová metoda přes tento index v EXPLAIN EXTENDED .

Všimněte si, že máte RANGE podmínky filtrování přes user_offtopic_count , proto nemůžete použít index nad tímto polem jak při filtrování, tak při řazení podle jiného pole.

V závislosti na tom, jak selektivní je váš user_offtopic_count (tj. kolik řádků vyhovuje user_offtopic_count < 10 ), může být užitečnější vytvořit index na user_offtopic_count a nechat seřadit post_dates.

Chcete-li to provést, vytvořte složený index pro postings (is_active, user_offtopic_count) a ujistěte se, že RANGE je použita přístupová metoda přes tento index.

Který index bude rychlejší závisí na vaší distribuci dat. Vytvořte oba indexy, FORCE a podívejte se, který je rychlejší:

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. Jak provést uloženou proceduru Oracle prostřednictvím odkazu na databázi

  2. Jak výkonný je váš uzel ProxySQL?

  3. Připojení MySQL nefunguje

  4. cURL a PHP zobrazení 1