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

Mysqlを自動パーティションに設定できますか?

    (この回答はスキーマとSELECTに向けられています。)

    何百万もの行が予想されるので、最初にスキーマのいくつかの改善点を指摘したいと思います。

    • FLOAT(m,n) これは通常、2つの丸めにつながるため、「間違った」ことです。プレーンなFLOATを使用する (電圧などの指標には「正しい」ようです)またはDECIMAL(m,n)を使用します 。 FLOAT 4バイトです。与えられた場合、DECIMAL 3バイトまたは4バイトになります。

    • 両方のINDEX(a)がある場合 およびINDEX(a,b) 、後者はそのようなことをカバーできるので、前者は不要です。不要なキーが3つあります。これにより、INSERTsの速度が低下します 。

    • INT(3) -「3桁の数字」って言ってるの?その場合は、TINYINT UNSIGNEDを検討してください。 (値0..255)INTの代わりに1バイト 4バイトの場合。これにより、多くのMBのディスク容量が節約されるため、速度が向上します。 (SMALLINTも参照してください 、など、およびSIGNED またはUNSIGNED 。)

    • filenameの場合 何度も繰り返される場合は、「正規化」することをお勧めします。これにより、多くのMBを節約できます。

    • NOT NULLを使用する NULLが必要な場合を除きます 何かのために。

    • AUTO_INCREMENT=690892041 idで災害への道の約1/3であることを意味します 、これは約20億で最高になります。 idを使用していますか 何かのために?列を削除すると、問題を回避できます。 UNIQUE KEYを変更します PRIMARY KEYへ 。 (idが必要な場合 、さらに話しましょう。)

    • ENGINE=MyISAM -切り替えには、有利な場合と不利な場合の両方の影響があります。テーブルは2〜3倍の大きさになります。 PRIMARY KEYの「正しい」選択 これをさらにスピードアップします SELECT 大幅。 (そして、他のSELECTsを遅くする場合と遅くしない場合があります 。)

    SELECTに関するメモ :string以降 およびunit_num はクエリの定数であり、ORDER BY timestamp asc, string asc, unit_num ascの最後の2つのフィールドです。 不要です。 SELECTでは明らかでない理由で関連性がある場合 、その後、私のアドバイスは不完全かもしれません。

    これ

    WHERE filename = 'foobar'
      AND unit_num='40'
      AND string='2' 
      AND timestamp >= ...
    

    INDEX(filename, unit_name, string, timestamp)によって最適に処理されます 。列の順序は重要ではありません そのtimestamp 最後である必要があります 。現在のUNIQUEを再配置する キー、あなたはあなたに最適なインデックスを与えます。 (一方、このSELECTに適したインデックスはありません。 。)PRIMARY KEYにする テーブルInnoDBを使用すると、さらに高速になります。

    パーティショニング?利点はありません。パフォーマンスのためではありません。あなたが言及した他の何のためでもありません。パーティショニングの一般的な使用法は、「古い」をパージすることです。そのようなことをするつもりなら、さらに話しましょう。

    巨大なテーブルでは、すべての重要なSELECTsを確認するのが最適です。 同時に、他の人の速度を破壊しながら1人の速度を上げないようにします。 かもしれません パーティショニングがこの種のトレードオフに役立つことさえわかっています。



    1. ネストされたテーブル内に連想配列を入力します

    2. UUIDv4をMySQLに保存する

    3. 文字列で数値順に並べる

    4. SQLException:文字列またはバイナリデータは切り捨てられます