sql >> Database >  >> RDS >> Mysql

MijnSQL. WordPress. Langzame zoekopdracht bij gebruik van IN-instructies

De "oplossing" waar ik nu op ben gestuit, is behoorlijk lelijk, maar om de een of andere onverklaarbare reden werkt het. De STRAIGHT_JOIN . toevoegen Optimizer hint verlaagde de uitvoeringstijd van 18+ seconden naar ongeveer 0,0022 seconden. Gebaseerd op gezond verstand en deze vraag (Wanneer STRAIGHT_JOIN gebruiken met MySQL ), lijkt deze oplossing een slecht idee, maar het is het enige dat ik heb geprobeerd dat heeft gewerkt. Dus voorlopig houd ik me er aan. Als iemand ideeën heeft over waarom ik dit niet zou moeten doen, of wat ik in plaats daarvan zou moeten proberen, hoor ik het graag.

Als iemand nieuwsgierig is, heb ik het als een WordPress-filter als volgt geïmplementeerd:

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' );

En voor de volledigheid, hier is de EXPLAIN uitvoer voor de query bij gebruik van STRAIGHT_JOIN . Nogmaals, ik ben verbijsterd. De oude zoekopdracht gebruikte alleen ref en eq_ref waarvan ik begrijp dat het sneller is dan range , maar dit is om de een of andere reden orden van grootte sneller.

+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 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. onvolledige informatie van zoekopdracht op pg_views

  2. NodeJS MySQL - Hoe te weten of de verbinding is vrijgegeven of niet?

  3. Hoe 2 resultatensets in tegengestelde volgorde samen te voegen in MySQL

  4. Een nieuwe kolom toevoegen in een grote mysql-tabel