データベースの基盤
事務
トランザクションとは、単一の論理処理ユニットを構成するデータベースアクセス操作のグループを指します。これらの操作のSQLステートメントは一緒にカプセル化され、正常に実行されるか実行されないかのいずれかであり、各SQLステートメントは実行直後には実行されません。ただし、コミット後にすべてのSQL実行結果を送信します
トランザクションの特性
- アトミシティ
- 一貫性: 1つの正しいデータ状態が別の正しい状態に変化します
- 分離:同時に実行されるトランザクションは相互に干渉できません、分離レベル
- 永続性:トランザクションがコミットされた後のデータベース内のデータへの変更は永続的です
トランザクションの並行性の結果
- ダーティ読み取り:別の並行トランザクションによって変更されたが、正常にコミットされなかったダーティデータを読み取ります
- 繰り返し不可の読み取り:データを読み取った後、データは別のトランザクションによって変更されます。つまり、2回読み取られたデータは異なります。
- ファントムリーディング:共有することに同意したデータを読んで、新しいデータが2度目に追加されたことがわかりました
- 失われた更新:共有データを更新した後、もう一度読んで、更新された値が異なることを確認してください
トランザクション分離レベル
- コミットされていない読み取り:ダーティ読み取りなど、上記のすべての状態を引き起こします
- 送信された読み取り:ダーティ読み取りは回避できますが、他の状況があります
- 繰り返し可能な読み取り:ダーティな読み取り、繰り返し不可能な読み取りを回避できます
- シリアル化可能:ダーティな読み取り、繰り返し不可能な読み取り、ファントム読み取り、更新の損失を回避できます。
後で、同時パフォーマンスが低下します。
トランザクション分類
- フラットトランザクション:頻繁で単純な操作はすべて同じレベルであり、すべてが実行されるか実行されないかのいずれかです。
制限:トランザクションの特定の部分をコミットまたはロールバックしたり、いくつかのステップでコミットしたりすることはできません。 - セーブポイントを使用したフラットトランザクション:トランザクションの実行中に同じトランザクションで以前の状態へのロールバックを許可し、トランザクションの特定の状態を保存するようにセーブポイントを設定します。制限
:システムがクラッシュすると、すべてのセーブポイントが消え、簡単に失われます。 - チェーントランザクション:トランザクションをコミットするときは、不要なデータオブジェクトを解放し、必要な処理コンテキストを次のトランザクションに暗黙的に渡します。トランザクション操作をコミットし、次のトランザクション操作を開始すると、1つのアトミック操作に結合されます。これは、次のものが前のトランザクションの結果を、あたかもトランザクション内にあるかのように見ることを意味します。
- ネストされたトランザクション:階層構造。これは、すべてのレベルで業務を管理するトップレベルのトランザクション(トップレベルのトランザクション)で構成されます。トップレベルのトランザクションの下では、ネストされたトランザクションはサブトランザクション(サブトランザクション)と呼ばれ、各部分変換を制御します。
- 分散トランザクション:通常は分散環境で実行されるフラットトランザクションであるため、データの場所に応じてネットワーク内のさまざまなノードにアクセスする必要があります
データベースの最適化
3つのパラダイム
- 第一正規形:属性の原子性、不可分
- 2番目の正規形:いくつかの機能依存性を排除します。非プライマリ属性はプライマリ属性に依存する必要があります
- 3番目のパラダイム:推移的な依存関係を排除し、非プライマリ属性はプライマリ属性に直接依存する必要があり、推移的な依存関係は
データベースの整合性
- エンティティの整合性:主キーは一意であり、空ではありません
- 参照整合性:主キーと外部キーは一貫しており、外部キーは空にすることができますが、正しくないことはできません
- ユーザー定義の整合性:データの特定の列に対する制約
サブデータベースとサブテーブル
- 縦型スプリット:垂直分割がプレステーブルとることであるモジュールを内のデータベース、異なるデータベースへのモジュールと関数は、テーブルを分割するためには、傾向にあるサービス
- 水平分割:水平分割は、特定のルールに従ってテーブルを異なるテーブルまたはデータベースに分割することです。たとえば、時間、アカウントルール、年、モジュロアルゴリズムなどによって。
サブテーブルのデメリット
- ページネーションクエリの難しさ
- 非常に限られたクエリ
解決策
通常、メインテーブルにはすべてのデータが格納され、ビジネスとmycarサブテーブルの機能に応じて水平方向に分割されます。
遅いクエリ
MySQLはデフォルトで10秒以内にSQL結果に応答しないため、低速クエリに
なります。MySQL低速クエリのデフォルト時間を変更できます。
遅いクエリを変更する
--查询慢查询时间
show variables like 'long_query_time';
--修改慢查询时间
set long_query_time=1; ---但是重启mysql之后,long_query_time依然是my.ini中的值
インデックスと主キーの違い
キー:物理的構造、2つの意味があります
- 制約:データベースの整合性に注意してください
- インデックス:補助クエリ
主キー
バインディング効果:主キーと一意のストレージを調整するために、これは主キーインデックスを確立するためのキーでもありますが、mysqlは自動的に主キーの一意のインデックスを確立します
- 主キーは、データベーステーブルの各レコードを一意に識別します
- 主キーには一意の値が含まれている必要があります
- 主キー列をNULLにすることはできません
- 各テーブルには1つだけの主キーが必要です
一意のキー
制約機能:データの一意性を標準化し、データに一意のインデックスを確立して、レコードを一意に識別します
- 主キーと一意キーの両方が列の一意性を保証します。違いは、テーブルには複数の一意キーが存在する可能性があり、主キーは1つしか存在できないことです。
- mysqlのキーには、制約とインデックスの2つの意味があります。
インデックス
- インデックスはデータベースの物理構造であり、クエリを支援するだけです。インデックスが作成されると、別の表スペースのディレクトリのような構造に格納されます。
- インデックスは、プレフィックスインデックス、フルテキストインデックスなどに分けられます。
- インデックスは単なるインデックスであり、インデックス付きフィールドの動作を制限するものではありません(これがキーの機能です)。
インデックス分類
主キーインデックス:「PRIMARYKEY」として指定する必要があります。PRIMARYインデックスはありません。一意の
インデックス:一意のインデックス。通常は一意のキーとして記述されます。
通常のインデックス:インデックス。これのみが純粋なインデックスです。
データベースのバックアップ
- フルバックアップ
一般的に使用され、ユーザーテーブル、システムテーブル、インデックス、ビュー、ストアドプロシージャなどのすべてのデータベースオブジェクトを含むデータベース全体をバックアップします。ただし、時間とスペースもかかるため、通常は週に1回完全バックアップを実行することをお勧めします。 - トランザクションログのバックアップ
トランザクションログは、データベースへの変更を記録する別個のファイルです。バックアップする場合、最後のバックアップ以降にデータベースに加えられた変更をコピーするだけでよいため、少しの時間しかかかりません。データベースを堅牢にするために、トランザクションログを1時間ごとまたはそれ以上の頻度でバックアップすることをお勧めします。 - 差分バックアップは
、増分バックアップとも呼ばれます。これは、データベースの一部のみをバックアップする別の方法です。トランザクションログを使用せず、代わりにデータベース全体の新しいイメージを使用します。前回の完全バックアップ以降に変更されたデータベースのみが含まれているため、最初の完全バックアップよりも小さくなります。その利点は、ストレージとリカバリの速度が速いことです。毎日差分バックアップを行うことをお勧めします。 - ファイルのバックアップ
データベースは、ハードディスク上の多数のファイルで構成できます。データベースが非常に大きく、一晩でバックアップできない場合は、ファイルバックアップを使用してデータベースの一部を毎晩バックアップできます。データベースは通常、複数のファイルストレージを使用するのに十分な大きさではないため、この種のバックアップはあまり一般的ではありません。
データベースの回復
データベース回復テクノロジは、データベースバックアップファイルとデータベーストランザクションログファイルを使用して、データベース回復処理を実行することです。ユーザーの回復要件に応じて、トランザクションをロールフォワードまたはロールバックしてデータベースを復元する必要があります。
ロールフォワード
- 障害が発生する前にデータベースのバックアップファイルを復元する必要がある場合は、ロールフォワードトランザクション回復方法を使用できます。
- ロールフォワードは回復を表します。つまり、未完了のトランザクションを実行し続けます。
- メモリからディスクへの書き込み
不完全にコミットされたトランザクション、つまりトランザクションはcommitコマンドによって実行されましたが、トランザクションの変更に対応するダーティデータブロックの一部のみがディスク上のデータファイルに書き込まれ、一部はコミットとして設定されていますマークダーティブロックはまだメモリ内にあります。この時点でデータベースインスタンスがクラッシュした場合、データベースインスタンスが復元されたら、ロールフォワード(このメカニズム)を使用して、トランザクションの完全なコミット、つまり前の部分を完了する必要があります。コミットマークに設定されて返されましたメモリ内のダーティブロックがディスク上のデータファイルに書き込まれます
ロールバック
- 障害後にデータベースバックアップファイルを復元する必要がある場合は、ロールバックトランザクション回復方法を使用できます。
- 取り消す
- ディスクに書き込まれたダーティデータの一部が取り消されます
コミットされていないトランザクション、つまり、トランザクションがcommitコマンドで実行されていません。ただし、この時点で、トランザクションによって変更されたダーティブロックの一部もデータファイルに書き込まれる可能性があります。この時点でデータベースインスタンスがクラッシュした場合、データベースインスタンスが復元されると、以前にデータファイルに書き込まれたダーティブロックを削除するためにロールバック(このメカニズム)が必要になります。
SQLステートメントを頻繁にテストする
学生の成績証明書で2つのスコアが80を超える学生の名前を見つけます
select s.name from student s
where s.score > 80
group by s.name
having count(*)>=2;
mysqlがMysql
データベースのバックアップを最適化する方法mysqlを実装する方法
は、id(int)とname(string)を含む学生テーブルを作成し、主キーを作成します。CREATETABLE stu(id INT(5)、name VARCHAR(100) 、PRIMARY KEY(id));
mysql create index CREATE INDEX index_name ON table_name(column_list)CREATE INDEX idx_c4 ON t(c4);
データベースクエリ10-20行の内容:select * from stu limit 10、10;
135で始まる電話を検索します。「135%」のようなtelがテーブルから*を選択します。
左結合、右結合、および内部結合がパフォーマンスに影響します。