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

階層データ全体でのMySQLクエリの最適化

    テストに時間を費やすことなく、不完全な例を提供しましたか?必ず並べ替えを試してください。 結合されたテーブルの。 Explain出力はいくつかの情報を提供します。たとえば、key_lenによる順序付けはヒューリスティックに最速である必要があります。オプティマイザがそれを理解できない場合に備えて、フィルタリングされる最初のテーブルを最後にリストする必要があります。

    したがって、「c、v、k、u」の順序が最適だとしましょう。

    SELECT DISTINCT
      `v`.`key`,
      `u`.`val`
    FROM
      `VertexDictionary`  AS `u`
      JOIN `SpecialKeys`       AS `k` ON (`k`.`x`, `k`.`key`) = (`u`.`x`, `u`.`key`)
      JOIN `VertexDictionary`  AS `v`
      JOIN `ConnectedVertices` AS `c` ON (`u`.`x`, `u`.`y`  ) = (`c`.`tail_x`, `c`.`tail_y`)
               AND (`v`.`x`, `v`.`y`  ) = (`c`.`head_x`, `c`.`head_y`)
    WHERE
      `v`.`x` = X
    ;
    

    「行」は「c/u、k、v」の順序を示唆しますが、それはデータによって異なります:

    SELECT DISTINCT
      `v`.`key`,
      `u`.`val`
    FROM
      `VertexDictionary`  AS `u`
      JOIN `VertexDictionary`  AS `v`
      JOIN `SpecialKeys`       AS `k` ON (`k`.`x`, `k`.`key`) = (`u`.`x`, `u`.`key`)
      JOIN `ConnectedVertices` AS `c` ON (`u`.`x`, `u`.`y`  ) = (`c`.`tail_x`, `c`.`tail_y`)
                                     AND (`v`.`x`, `v`.`y`  ) = (`c`.`head_x`, `c`.`head_y`)
     WHERE
      `v`.`x` = X
    ;
    

    これがお役に立てば幸いです。

    更新 (varchar結合を回避する):

    SELECT DISTINCT
      `v`.`key`,
      `u`.`val`
    FROM
           `ConnectedVertices` AS `c`
      JOIN `VertexDictionary`  AS `u` ON (`u`.`x`, `u`.`y`  ) = (`c`.`tail_x`, `c`.`tail_y`)
      JOIN `VertexDictionary`  AS `v` ON (`v`.`x`, `v`.`y`  ) = (`c`.`head_x`, `c`.`head_y`)
    WHERE
      (`u`.`x`, `u`.`key`) IN (SELECT `k`.`x`, `k`.`key` FROM `SpecialKeys` AS `k`)
    AND
      `v`.`x` = X
    ;
    


    1. MySQLSpatialCONTAINSが間違った結果を表示する

    2. ウェブサイトとそのファイルをapache2サーバーで作成するときに/var/ www/html内でアクセスが拒否されました

    3. SQLでREPLACEを使用する方法

    4. MySQLC++コネクタのメモリリーク