sql >> データベース >  >> RDS >> Mysql

MySQL。 WordPress。 INステートメントを使用するときの遅いクエリ

    私が今のところつまずいた「解決策」はかなり醜いですが、いくつかの不可解な理由で、それは機能します。 STRAIGHT_JOINを追加する オプティマイザーヒントにより、実行時間が18秒以上から約0.0022秒に短縮されました。常識とこの質問に基づいています(MySQLでSTRAIGHT_JOINを使用する場合 )、この解決策は悪い考えのように思えますが、私が試した唯一の方法でうまくいきました。だから、少なくとも今のところ、私はそれに固執しています。なぜ私がこれをすべきではないのか、あるいは私が代わりに何を試みるべきなのかについて誰かが何か考えを持っているなら、私はそれらを聞いてみたいです。

    興味があれば、WordPressフィルターとして次のように実装しました:

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

    完全を期すために、ここにEXPLAINがあります STRAIGHT_JOINを使用した場合のクエリの出力 。繰り返しますが、私は困惑しています。古いクエリはrefのみを使用していました およびeq_ref rangeよりも速いと私は理解しています 、しかし、これは何らかの理由で桁違いに高速です。

    +-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
    | 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. PHPでアクティベーションリンクを期限切れにする方法は?

    2. OracleのDBA_DEPENDENCIESビューの濃度を再帰的に一覧表示します

    3. PHPを使用して年月アーカイブのコンテンツをカウントする

    4. Node.JSを使用してJSONオブジェクトデータをMySQLに挿入します