sql >> Databasteknik >  >> RDS >> Mysql

MySQL. WordPress. Långsam fråga när du använder IN-satser

"Lösningen" jag har snubblat på nu är ganska ful, men av någon oförklarlig anledning fungerar den. Lägger till STRAIGHT_JOIN optimeringstipset sänkte exekveringstiden från 18+ sekunder till cirka 0,0022 sekunder. Baserat på sunt förnuft och denna fråga (När man ska använda STRAIGHT_JOIN med MySQL ), verkar den här lösningen vara en dålig idé, men det är det enda jag har testat som har fungerat. Så nu håller jag i alla fall till det. Om någon har några tankar om varför jag inte borde göra det här, eller vad jag borde prova istället, skulle jag gärna höra dem.

Om någon är nyfiken, implementerade jag det som ett WordPress-filter så här:

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

Och för fullständighetens skull, här är EXPLAIN utdata för frågan när du använder STRAIGHT_JOIN . Återigen, jag är förbryllad. Den gamla frågan använde endast ref och eq_ref som jag förstår är snabbare än range , men detta är storleksordningar snabbare av någon anledning.

+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 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. PL/SQL-prestandajustering för LIKE '%...%' jokerteckenfrågor

  2. MySql-infogningen i den valda frågan är för långsam för att kopiera 100 miljoner rader

  3. Hur man hämtar fält från MySQL-frågeresultat i bash

  4. Hur kör man skrivbordsapplikationer med databas lokalt utan att installera någon databasserver?