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

MySQLでのUUIDパフォーマンス?

    私の仕事では、PKとしてUUIDを使用しています。経験から言えることは、PKとして使用しないでください(ちなみにSQL Server)。

    これは、レコード数が1000未満の場合は問題ありませんが、数百万の場合は最悪の事態です。なんで? UUIDはシーケンシャルではないため、新しいレコードが挿入されるたびに、MSSQLはレコードを挿入する正しいページを確認してから、レコードを挿入する必要があります。これによる本当に醜い結果は、ページがすべて異なるサイズになり、断片化されることです。そのため、定期的に断片化解除を行う必要があります。

    自動インクリメントを使用すると、MSSQLは常に最後のページに移動し、(理論的には)同じサイズのページになるため、これらのレコードを選択するパフォーマンスが大幅に向上します(また、INSERTがテーブル/ページをブロックしないため)とても長いです。

    ただし、UUIDをPKとして使用することの大きな利点は、DBのクラスターがある場合、マージ時に競合が発生しないことです。

    次のモデルをお勧めします:1。 PKINTIdentity2。 UUIDとして自動的に生成される追加の列。

    このようにして、マージプロセスが可能になります(UUIDはREALキーになりますが、PKはパフォーマンスを向上させる一時的なものになります)。

    注:最善の解決策はNEWSEQUENTIALIDを使用することです(コメントで言ったように)が、リファクタリングする時間があまりない(さらに悪いことに、すべての挿入を制御しない)レガシーアプリの場合、それは不可能です。 2017年の時点で、ここでの最善の解決策はNEWSEQUENTIALIDか、NHibernateでGuid.Combを実行することだと思います。

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



    1. SQLServerのインデックスの再構築と再編成

    2. ClusterControl-高度なバックアップ管理-mariabackupパートII

    3. 12cのSEC_CASE_SENSTIVE_LOGON

    4. 遅いクエリでMySQLのパフォーマンスの問題を特定する方法