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

InnoDBテーブルとMyISAMテーブルの結合

    私にすぐに飛び出すのはMyISAM

    アスペクト#1:参加自体

    MyISAMとInnoDBが関係する結合がある場合は常に、クエリと MVCC MyISAMデータには適用できません。 MVCC 場合によっては、InnoDBに適用することさえできません。

    アスペクト#2:MyISAMの関与

    別の見方をすれば、MyISAMテーブルがINSERT、UPDATE、またはDELETEを介して更新されている場合、JOINクエリに含まれるMyISAMテーブルは他のDB接続からロックされ、JOINクエリはMyISAMテーブルが読み取れるまで待機する必要があります。残念ながら、JOINクエリにInnoDBとMyISAMが混在している場合、書き込みが保留されるため、InnoDBテーブルはJOINクエリのMyISAMパートナーのように断続的にロックされる必要があります。

    MVCCは、READ-UNCOMMITTEDおよびREPEATABLE-READトランザクションが正常に機能し、特定のデータのビューは、他のトランザクションで利用できます。 READ-COMMITTEDとSERIALIZABLEについて同じことを言うことはできません

    ASPECT#3:クエリオプティマイザー

    MySQLは、インデックスカーディナリティに依存して、最適化されたEXPLAINプランを決定します。インデックスのカーディナリティは、多くのINSERT、UPDATE、およびDELETEがテーブルで発生するまで、MyISAMテーブルで安定しています。これにより、定期的にOPTIMIZE TABLEを実行できます。 MyISAMテーブルに対して。 InnoDBインデックスのカーディナリティは決して安定していません!!! SHOW INDEXES FROM *innodbtable*;を実行した場合 、そのコマンドを実行するたびに、インデックスのカーディナリティが変化するのがわかります。これは、InnoDBがカーディナリティを推定するためにインデックスに飛び込むためです。 OPTIMIZE TABLEを実行しても InnoDBテーブルに対しては、テーブルを最適化するだけです。 OPTIMIZE TABLE ANALYZE TABLEを実行します テーブルに対してインデックス統計を生成するために内部的に。これはMyISAMで機能します。 InnoDBはそれを無視します。

    私からのアドバイスは、すべてを調べてすべてをInnoDBに変換し、それに応じて設定を最適化することです。

    UPDATE 2012-12-18 15:56 EDT

    信じられないかもしれませんが、まだInnoDB/MyISAMのオープンチケットが参加していますSELECT FOR UPDATE 。読んだ場合、解像度は次のように要約されます。実行しないでください!!!



    1. PHP:レコードが存在する場合はHTMLを表示し、存在しない場合は何も表示しません

    2. MySQLテーブルの主キーをプレフィックス付きで自動インクリメントする方法

    3. GROUPBYとORDERBY

    4. Moodle3.9でデータベーストラフィックの読み取り/書き込み分割を使用してパフォーマンスを向上させる