sql >> Database teknologi >  >> RDS >> Mysql

MySQL-ydeevneoptimering:rækkefølge efter dato og klokkeslæt felt

Opret et sammensat indeks enten på postings (is_active, post_date) (i nævnte rækkefølge).

Det vil blive brugt både til at filtrere på is_active og bestille inden post_date .

MySQL skal vise REF adgangsmetode over dette indeks i EXPLAIN EXTENDED .

Bemærk, at du har en RANGE filtreringsbetingelse over user_offtopic_count , derfor kan du ikke bruge et indeks over dette felt både ved filtrering og ved sortering efter andre felter.

Afhængigt af hvor selektiv din user_offtopic_count er (dvs. hvor mange rækker opfylder user_offtopic_count < 10 ), kan det være mere nyttigt at oprette et indeks på user_offtopic_count og lad post_datoerne sorteres.

For at gøre dette skal du oprette et sammensat indeks på postings (is_active, user_offtopic_count) og sørg for RANGE adgangsmetode over dette indeks bruges.

Hvilket indeks der vil være hurtigere afhænger af din datafordeling. Opret begge indekser, FORCE dem og se, hvad der er hurtigere:

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. Effektiv lagring af 7.300.000.000 rækker

  2. SQL:Hvad er bedre en bit eller et tegn(1)

  3. Python, MySQL og SELECT output til ordbog med kolonnenavne til nøgler

  4. En peer-to-peer udlånsplatform datamodel