ホームページ  >  に質問  >  本文

golang - 有哪些设计数据结构方面的小技巧(奇技淫巧)?

传奇的软件工程师Frederick P. Brooks曾经说过:“给我看你的数据”。因此可见数据结构对于一个程序来说是多么的重要,如果你不了解程序中的数据结构,你根本就无法去理解整个程序

有哪些设计数据结构方面的小技巧?

迷茫迷茫2709日前849

全員に返信(2)返信します

  • 怪我咯

    怪我咯2017-04-24 09:13:24

    前に書いた言葉: 災害復旧の重要性を思い出すのは常に災害が発生した後、誰かが思い出させてくれたことを思い出すのは常に損失を被った後です。

    この記事は主にmysqlデータベースに関するものです

    デザイン原則

    1. データベース内で計算を行わない: CPU 計算をビジネス層に移動する必要がある

    2. 単一テーブル内のデータ量を制御する: 単一テーブル内のレコードを 1,000 万件で制御する
    3.列の数: フィールドの数は 20 以内に制御されます
    4. パラダイムと冗長性のバランスをとる Yu: 効率を向上させるためにパラダイム設計と冗長データを犠牲にする
    5. 拒否 3B: 大規模な SQL、大規模なトランザクション、大規模なバッチを拒否します
    6.テーブル文字セットの場合
    7. INNODB ストレージ エンジンを使用します

    データテーブルの設計

    1. できるだけ効果的な (最小の) データ型を使用します

    リーリー

    2. 数値を文字列として保存せず、文字を数値に変換し、char(15) の代わりに int を使用して ip を保存します

    3. enum または set を最初に使用します。
    enum ('F', 'M')sex4、 NULL フィールドの使用を避ける
    リーリー

    5. テキスト/BLOB の使用を減らします。BLOB を使用する場合よりも varchar のパフォーマンスが大幅に向上します。 7. MyISAM テーブルの場合は、テーブルを分割しないでください。可変長列 (VARCHAR、TEXT、または BLOB 列) がない場合は、固定サイズのレコード形式を使用します。これは高速ですが、残念ながらスペースを無駄にする可能性があります。 CREATE オプションを使用して VARCHAR 列を ROW_FORMAT=fixed にした場合でも、固定長の行を使用するように求められることがあります

    8。 utf-8 は latin1 の 3 倍のスペースを占有するため、utf-8 の使用はできるだけ少なくしてください。 latin1 は、メール、URL など、utf-8 を使用する必要のないフィールドで使用できます。 9. 精度とスペースの変換。一般に、浮動小数点型は、同じ数値範囲のデータを格納する場合、DECIMAL 型よりも使用するスペースが少なくなります。 FLOAT フィールドはデータの格納に 4 バイトを使用します。 DOUBLE 型は 8 バイトを必要とし、精度が高く、より大きな数値範囲を持ちます。DECIMAL 型のデータは DOUBLE 型に変換されます
    10。ライブラリ名、テーブル名、フィールド名は 12 文字以内の固定長でなければなりません。ライブラリ名、テーブル名、フィールド名は 32 文字を超えることはできません。名前の意味を理解する必要があります。MySQL の予約語はライブラリ名、テーブル名、およびフィールド名では禁止されています。一時ライブラリとテーブルの名前には接頭辞として tmp を付け、接頭辞として bak を付ける必要があります。 InnoDB テーブル行レコードの物理長は 8KB を超えません。B+Tree の特性に基づいて、データ ページには少なくとも 2 レコードを保存する必要があります。したがって、大きな列 (特に TEXT/BLOB 列) の実際のストレージ長が 8KB を超えると、ORACLE の「行移行」と同様の「ページ オーバーフロー ストレージ」が発生します。 TEXT/BLOB タイプ)、頻繁に読み書きされる場合は、これらの列をサブテーブルに分割し、メイン テーブルと一緒に格納しないことが最善です。頻繁に行われない場合は、メイン テーブルに保持することを検討できます。 innodb
    page
    size オプションを 8KB に変更する場合、行レコードの物理長は 4KB
    を超えないようにすることをお勧めします。
    インデックスクラス
    1. インデックスは慎重かつ合理的に使用しますリーリー

    2. 文字フィールドはプレフィックスインデックスを構築する必要があります。
    3. インデックス内で列操作を実行しないでください。悪い例: age +1 = 10 の ID を選択します。
    4. innodb の主キーには自動インクリメント列を使用することをお勧めします。 リーリー

    5. 外部キーを使用しないでください。プログラムによる制約を確認してください。

    6. すでにインデックスが存在するプレフィックスにインデックスを作成しないでください。例: インデックス (a, b) が存在する場合、インデックス (a) を削除します
    7. 単一のインデックスの長さを制御します。キー (名前 (8)) を使用して、データの最初の数文字にインデックスを作成します。 8. インデックスを選択して使用します。性別列など、めったに変更されない列にインデックスを使用するのはあまり良いことではありません。 9. テーブルの最適化は、頻繁に実行しないように注意してください。 11. インデックスの選択性。インデックス値は、カーディナリティ テーブル内のデータ行数の比率とも呼ばれます。インデックスの選択性 = Count(distinct(username))/count(*) がインデックスの選択性です。インデックスの選択性が高いのは mysql です。一致を検索する場合、値 1
    12 を使用すると、より多くの行をフィルタリングできます。INNODB エンジンのインデックスには、重複したインデックスや冗長なインデックスを使用しないでください。データが変更されるたびに、主キー インデックスにインデックスを作成する必要があります。補助インデックス内の対応するインデックス値が変更されると、大量のデータの移行、ページング、断片化が発生する可能性があります。 20 の場合は、完全な列インデックスではなくプレフィックス インデックスを作成するのが最善です (例: ALTER TABLE t1 ADD INDEX(user(20)))。これによりインデックスの使用率が効果的に向上しますが、プレフィックス インデックスが作成されないという欠点があります。この列を並べ替えるときに使用されます。プレフィックス インデックスの長さは、フィールドの統計に基づいて決定できます。通常、平均の長さよりわずかに大きくなります。 14. pt-duplicate-key-checker ツールを定期的に使用して、重複したインデックスを確認し、削除します。たとえば、インデックス idx1(a, b) がすでにインデックス idx2(a) をカバーしている場合、idx2 インデックスを削除できます

    SQLステートメント設計クラス

    1. SQL ステートメントはできるだけ単純です。1 つの SQL は 1 つの CPU 上でのみ実行できます。ロック時間を短縮するために、1 つの大きな SQL でライブラリ全体をブロックできます。マルチコア CPU のフル活用)
    2. シンプルなトランザクション、トランザクション時間はできるだけ短くする必要があります。悪い例: 画像のアップロード トランザクション
    3. trig/func の使用を避け、トリガーと関数を使用せず、クライアントに置き換えます。プログラム
    4. CPU、IO、メモリ、帯域幅を消費する select * は必要ありません。この種のプログラムはスケーラブルではありません

    5. または IN() として書き換えられます。 リーリー

    6. OR は UNION に書き換えられます

    MySQL のインデックスのマージは非常に愚かです
    リーリー
    7. not in/like などの負の % を避ける
    8. count(*) は慎重に使用してください
    9.

    制限が大きいほど、効率は低くなります

    リーリー

    10. Union の代わりに Union all を使用します。Union には重複排除のオーバーヘッドがあります。

    12. グループ化、グループ化、および自動ソートを使用します。

    13. インポートには同じタイプの比較を使用してください。データの読み込みは挿入よりも約 20 倍高速です。

    15. データの更新は一度に大量のデータを分割して更新しないでください。
    16. リーリー
    17. --log-slow-queries --long-query-time=2 を使用して、スロークエリステートメントを表示します。次に、Explain を使用してクエリを分析し、最適化を行います

    リーリー

    最適化 データの挿入、更新、削除時には、ある程度のデータ移行とページングが避けられず、時間の経過とともに断片が蓄積され、パフォーマンスに影響を与えるため、DBA は断片を減らすためにデータベースを定期的に最適化する必要があります。これは最適化コマンドによって行われます。たとえば、MyISAM テーブルを操作する場合: テーブル テーブル名を最適化します

    18. データベース内で大規模なクエリを実行することは禁止されています。
    19. SQL ステートメントを 1 回解析して複数回使用するよりも効率的な、プリコンパイルされたステートメントを使用します。 rand() による order の使用は禁止されています
    21. 単一の SQL ステートメントで複数のテーブルを同時に更新することは禁止されています
    22. データベース内の数学的演算は避けてください (MySQL は数学的演算と論理的判断が苦手です)
    23. SQL ステートメントにはすべての研究開発が必要であり、すべての SQL キーワードは大文字であり、各単語に使用できるスペースは 1 つだけです
    24. NOT IN を使用できる場合は、NOTIN を使用できます。落とし穴が多すぎます。 。空と NULL をチェックアウトします

    注意

    1. インデックスに基づいた条件付きフィルタリングであっても、スキャンする必要があるデータの総量が 30% を超えるとオプティマイザが認識した場合は、スキャンする必要があるデータの総量が 30% であることがわかります。 2. 複数のテーブルを結合する場合、フィルタリング能力が最も高いテーブルを選択します (必ずしもデータ量が最小である必要はありません)。ただし、ドライバー テーブルに WHERE 条件を追加した後のフィルター機能が最も優れたものです)。さらに、JOIN の後に並べ替えがある場合は、並べ替えフィールドがドライバー テーブルに属している必要があります。これにより、ドライバー テーブルのインデックスを使用して並べ替えを完了できます。 3. ほとんどの場合、並べ替えのコストは通常​​より高くなります。実行プランが表示されている場合は、filesort を使用して、ソートインデックスの作成を優先します

    4. pt-query-digest を使用してスロークエリログを定期的に分析し、Box Anemometer と組み合わせてスロークエリログの分析と最適化を構築します。システム

    返事
    0
  • 迷茫

    迷茫2017-04-24 09:13:24

    今日面白いものを見ました:
    どのアルゴリズム/データ構造を「認識」し、名前で知るべきですか?

    返事
    0
  • キャンセル返事