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

MySQL. WordPress. Pomalý dotaz při použití příkazů IN

"Řešení", na které jsem zatím narazil, je dost ošklivé, ale z nějakého nevysvětlitelného důvodu funguje. Přidání STRAIGHT_JOIN optimalizační nápověda snížila dobu provádění z 18+ sekund na přibližně 0,0022 sekund. Na základě zdravého rozumu a této otázky (Kdy použít STRAIGHT_JOIN s MySQL ), toto řešení se zdá být špatný nápad, ale je to jediná věc, kterou jsem zkusil, která fungovala. Takže se toho alespoň zatím držím. Pokud má někdo nějaké nápady, proč bych to neměl dělat nebo co bych měl místo toho zkusit, rád si je vyslechnu.

Pokud je někdo zvědavý, implementoval jsem to jako filtr WordPress takto:

function use_straight_join( $distinct_clause ) {

    $distinct_clause = ( $use_straight_join ) ? 'STRAIGHT_JOIN' . $distinct_clause : $distinct_clause;

    return $distinct_clause;
}
add_filter( 'posts_distinct', 'use_straight_join' );

A pro úplnost zde je EXPLAIN výstup pro dotaz při použití STRAIGHT_JOIN . Opět jsem zmaten. Starý dotaz používal pouze ref a eq_ref což chápu jako rychlejší než range , ale to je z nějakého důvodu řádově rychlejší.

+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| id  | select_type  |         table          | type   |      possible_keys        |       key         | key_len  |      ref        | rows  |                    Extra                     |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
|  1  | SIMPLE       | wp_posts               | range  | PRIMARY,type_status_date  | type_status_date  |     124  | NULL            |    6  | Using where; Using temporary; Using filesort |
|  1  | SIMPLE       | wp_postmeta            | ref    | post_id,meta_key          | post_id           |       8  | db.wp_posts.ID  |    2  | Using where                                  |
|  1  | SIMPLE       | mt1                    | ref    | post_id,meta_key          | post_id           |       8  | db.wp_posts.ID  |    2  | Using where                                  |
|  1  | SIMPLE       | mt2                    | ref    | post_id,meta_key          | post_id           |       8  | db.wp_posts.ID  |    2  | Using where                                  |
|  1  | SIMPLE       | mt3                    | ref    | post_id,meta_key          | post_id           |       8  | db.wp_posts.ID  |    2  | Using where                                  |
|  1  | SIMPLE       | mt4                    | ref    | post_id,meta_key          | post_id           |       8  | db.wp_posts.ID  |    2  | Using where                                  |
|  1  | SIMPLE       | mt5                    | ref    | post_id,meta_key          | post_id           |       8  | db.mt3.post_id  |    2  | Using where                                  |
|  1  | SIMPLE       | mt6                    | ref    | post_id,meta_key          | post_id           |       8  | db.wp_posts.ID  |    2  | Using where                                  |
|  1  | SIMPLE       | wp_term_relationships  | ref    | PRIMARY,term_taxonomy_id  | PRIMARY           |       8  | db.wp_posts.ID  |    1  | Using where; Using index                     |
|  1  | SIMPLE       | tt1                    | ref    | PRIMARY,term_taxonomy_id  | PRIMARY           |       8  | db.wp_posts.ID  |    1  | Using where; Using index                     |
|  1  | SIMPLE       | tt2                    | ref    | PRIMARY,term_taxonomy_id  | PRIMARY           |       8  | db.mt1.post_id  |    1  | Using where; Using index                     |
|  1  | SIMPLE       | tt3                    | ref    | PRIMARY,term_taxonomy_id  | PRIMARY           |       8  | db.wp_posts.ID  |    1  | Using where; Using index                     |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+


  1. Jaké jsou různé typy omezení dostupných v SQL Server - SQL Server / Výukový program T-SQL, část 50

  2. Instalace SQL Server 2017

  3. Funkce PDO vs pg_*

  4. Jak převést data do formátu json v SQL Server 2008?