この記事では、mysql データベースに関する関連知識を提供します。主に、インデックス、構文順序、実行順序、ストアド プロシージャ、およびその他の関連問題など、データベースのいくつかの基本的な知識ポイントを整理します。助けなければなりません。
1.1 トランザクション
1.1.1 4 つのトランザクション特性 (ACID)
- アトミシティ (
- Aomicity
)
トランザクション全体で必要な操作すべてのコミットが成功するか、すべて失敗してロールバックされます。
一貫性 ( - Consistency
)
操作の前後でデータベース内のデータの一貫性を確保します。 (たとえば、ユーザーの複数のアカウント間で送金するが、ユーザーの合計金額は変更されません)
分離 ( - 分離
)
分離では、トランザクションを実行するためのトランザクションが必要です。データベース内のデータ 変更は、コミットされるまで他のトランザクションには表示されません。 (つまり、トランザクションはシリアルに実行する必要があります)
永続性 ( - 耐久性
)
永続性とは、トランザクションが送信されると、データベース内のデータへの変更が永続的に維持されることを意味します。データベース システムに障害が発生した場合でも、トランザクションをコミットする操作は失われません。
標準では 4 種類の分離が定義されています: (以下の分離は低から高の順であり、同時実行性は高から低の順です)
- 最も低い分離レベル。他のトランザクションがコミットされていないデータを参照できるようになります。これにより、ダーティ リードが発生します。
-
送信済みの記事を読みました。 データベースは読み取りと書き込みが分離されているため、トランザクションの読み取り時に読み取りロックが取得されますが、読み取り後すぐに解放されます。読み取りロックが解放された後、他のトランザクションによってデータが変更される可能性があります。再度読み取りを行うと、を実行すると、前後でデータが読み取られたことがわかりますが、結果が異なるため、読み取りが再現できなくなります。 (読み取りロックはトランザクションのコミット後に解放する必要はありませんが、書き込みロックはトランザクションのコミット後に解放する必要があります。) -
反復可能な読み取り。 - select
によって取得されたすべてのデータは、トランザクションの前後で読み取りの不一致を避けるために変更できません。ただし、現時点では他のトランザクションは選択されたデータを変更できませんが、データを追加することはできるため、ファントム読み取りを制御する方法はありません。はシリアル化できます。
ファントム読み取りを回避するために、すべてのトランザクションは次々に実行されます。ロックに基づいた同時実行制御を実装するデータベースの場合、シリアル化では、範囲クエリを実行するときに範囲ロックを取得する必要があります。同時実行がベースで実装されていない場合は、ロック、制御データベースでは、シリアル操作に違反するトランザクションが検出された場合、トランザクションをロールバックする必要があります。
分離レベル ダーティリード Non-repeatable Phantom read
Read uncommitted 可 可 可 Read Committed 不可 可 おそらく Repeatable read read) 不可 不可 可
Serializable 不可 不可不可能
##要約: コミットされていない読み取りによりダーティ リードが発生します—> コミットされた読み取りによりダーティ リードは解決されますが、反復不可能な読み取りが発生します -> 反復可能な読み取りにより、一貫性のない読み取り結果の問題は解決されますが、ファントム読み取りが発生します (そうではありません)以前はありましたが、現在は) -> シリアル化可能によりファントム読み取りは解決されますが、多くの範囲ロックが追加され、ロック タイムアウトが発生する可能性があります;
1.1.2 ダーティ リード、非反復読み取り、およびファントム リード
- ダーティ リード (ロールバック操作用): トランザクション T1 がレコードの内容の行を更新しましたトランザクション T2 が更新された行を読み取り、T1 がロールバック操作を実行して、行ったばかりの変更をキャンセルしました。 T2 によって読み取られた行の数が無効になりました (1 つのトランザクションが別のトランザクションを読み取りました);
- Non-repeatable read (変更された操作の場合): トランザクション T1 がレコードの行を読み取り、その後 T2 がそれを変更しました T1 は読み取りだけでしたレコードの行を読み取った後、T1 がこのレコードの行を再度読み取ったところ、結果が今読み取った結果と異なることがわかりました。
- ファントム読み取り (更新操作の場合): トランザクション T1 は、指定された where 句によって返された結果セットを読み取り、トランザクション T2 は、T1 条件で使用されるクエリを正確に満たす新しいレコード行を挿入します。次に、T1 はテーブルを再度取得しますが、T2 によって挿入されたデータが再度表示されます。 (1 回目は見ませんでしたが、2 回目で見ました)
2. インデックス
2.1 インデックスの機能
- データベースの取得を高速化できます。
- はビューではなくテーブルにのみ作成できます。
- は直接または間接的に作成できます。
- は、実行中に非表示にできます。最適化 インデックスの使用;
- クエリ プロセッサを使用して SQL ステートメントを実行します。テーブルでは、一度に 1 つのインデックスのみ使用できます。
2.1.1 インデックスの利点
- 一意のインデックスを作成して、データベース テーブル内のデータの各行の一意性を確保します;
- インデックスを作成する主な理由であるデータ取得を大幅に高速化します;
- 特にデータベース参照の整合性を達成する際に、データベース テーブル間のリンクを高速化します;
- グループ化と並べ替えを使用する場合取得用の句を使用すると、クエリ内のグループ化と並べ替えにかかる時間も大幅に短縮できます。
- インデックスを使用すると、クエリ内で最適化ハイダーを使用してシステム パフォーマンスを向上させることができます。
2.1.2 インデックスの欠点
- インデックスの作成と維持には時間がかかり、数が増えるとその時間も長くなります。
- インデックス作成には物理的なスペースを占有する必要があります。データ テーブルが占有するデータ領域に加えて、各インデックスも一定量の物理領域を占有します。クラスタ化インデックスが確立されている場合、必要な領域はさらに大きくなります。
- テーブル内のデータを比較する場合追加、削除、変更を行うとインデックスもメンテナンスする必要があり、データのメンテナンス速度が低下します。
2.2 インデックスの分類
(1) 通常のインデックス(制限はありません。)
(2) 一意のインデックス (インデックス列の値は一意である必要がありますが、null 値も許可されます。)
(3) 主キー インデックス (特別な一意のインデックス) (null 値は許可されません) 。通常、主キー インデックスはテーブルの作成時に同時に作成されます。)
(4) 結合インデックス
(5) クラスター化インデックスは、次に従って B ツリーを構築します。各テーブルの主キー、およびリーフ ノードにはテーブル レコード データ全体が格納されるため、クラスター化インデックスのリーフ ノードはデータ ページになります。
(6) 非クラスター化インデックス (補助インデックス) (ページ ノードはレコードの行全体を保存しません)。
2.3 インデックスの無効化
(1) 条件内に or がある場合、インデックス付きの条件があっても使用されません(使用またはできるだけ少なくしてください);
(2) like クエリは % で始まります。たとえば、SELECT * FROM mytable WHEREt Name like'�min';
(3) 列の型が文字列の場合は、次のようにする必要があります。条件内で引用符で囲む必要があります。そうでない場合、インデックスは使用されません。
2.4 各エンジンはインデックス
MyISAM
,## をサポートします。 #InnoDB,
Memory 一般的に使用される 3 つの
MySQL エンジン タイプの比較:
3 myisam インデックス InnoDB インデックス Memory インデックス
B ツリー インデックスのサポート サポート
ハッシュインデックスはサポートなしではサポートされません
R-Tree Index サポートあり サポートされていない サポートされていない
全文インデックス サポートされていない まだサポートされていない サポートされていない
2.5 データベース内のインデックス構造
バイナリ ツリーを使用する場合、バイナリ ツリーの深さが大きすぎるため、I/O の読み取りと書き込みが頻繁になり、クエリ効率が低下します。したがって、マルチウェイ ツリー構造を使用すると、B ツリーに対するさまざまな操作によって B ツリーの高さを低く抑えることができます。 B ツリーは平衡型マルチパス探索ツリーとも呼ばれ、m 次の B ツリーの特徴は次のとおりです。- 1. ツリー内の各ノードには最大で m 個の子が含まれます (m>=2);
- 2. ルート ノードとリーフ ノードを除き、他の各ノードには少なくとも (ceil (m/2)) 子 (ceil (x) は上限を取る関数です);
- 3. ルート ノードには少なくとも 2 つの子があります (B ツリーにノードが 1 つしか含まれていない場合:ルート ノード);
- 4. すべてのリーフ ノードは同じレイヤーに表示され、リーフ ノードにはキーワード情報が含まれません (外部ノードまたはクエリが失敗したノードと見なすことができ、これらのノードを指します。 (注: リーフ ノードには子と子へのポインタがないだけです。これらのノードも存在し、要素を持ちます。赤黒ツリーと同様に、各 null ポインタはリーフ ノードとみなされますが、 (1)よく出てくるキーワード order by、group by、distinct に従ってフィールドにインデックスを作成する;
(2) Union などの集合演算の結果セット フィールドにインデックスを作成する インデックスを作成する目的は同じです。上記と同様;(3) 選択したフィールドをクエリしてインデックスを作成するためによく使用されます;
(4) テーブル リンクとしてよく使用される属性にインデックスを作成します; (5) インデックス カバレッジの使用を検討してくださいデータがめったに更新されないテーブルの場合、ユーザーが少数のフィールドのみを頻繁にクエリする場合は、これらのフィールドにインデックスを作成して、テーブル スキャンをインデックス スキャンに変更することを検討できます。3. Mysql 構文の順序
つまり、次のキーワードが SQL に存在する場合、この順序を維持する必要があります:
select[distinct ] 、from、join (左結合など)、on、where、group
by、having、union、order by、limit;
4. Mysql の実行順序
つまり、SQL は実行中に次の順序で実行されます:
from、on、join、where、group by、having、select、distinct、union、order by
group by and集計関数は一緒に使用されます。
例:
select a.Customer,sum(a.OrderPrice) from orders a where a.Customer=’Bush’ or a.Customer = ‘Adams’ group by a.Customer;
複数テーブルのクエリ (内部結合) を実現
select u.uname,a.addr from lm_user u inner join lm_addr a on u.uid = a.uid;
## を使用しても同じことが実現できます。 #select from where
select u.uname,a.addr from lm_user u, lm_addr a where u.uid = a.uid;5. ストアド プロシージャ
delimiter $$ create procedure procedure_bill() comment '查询所有销售情况' begin select billid, tx_time, amt from lm_bill; end $$ delimiter ;
呼び出しストアド プロシージャ
call procedure_bill();
表示ストアド プロシージャ
show procedure status like 'procedure_bill';
6. 多くのストアド プロシージャを確立します。 -対多のデータ テーブルの関係
データベース内で、2 つのテーブル間の関係が「学生テーブルとコース スケジュール」などの多対多の関係である場合、学生は複数のコースを選択できます。 、およびコースは複数の学生によって選択することもできます。選択; データベースの設計原則に従って、3 番目の関連テーブルを形成する必要があります。
/**学生表*/
CREATE TABLE Student (
stu_id INT AUTO_INCREMENT,
NAME VARCHAR(30),
age INT ,
class VARCHAR(50),
address VARCHAR(100),
PRIMARY KEY(stu_id)
)
/*学生课程表*/
CREATE TABLE Course(
cour_id INT AUTO_INCREMENT,
NAME VARCHAR(50),
CODE VARCHAR(30),
PRIMARY KEY(cour_id)
)
/**学生课程关联表*/
CREATE TABLE Stu_Cour(
sc_id INT AUTO_INCREMENT,
stu_id INT ,
cour_id INT,
PRIMARY KEY(sc_id)
)
ステップ 2: Stu_Cour 関連テーブルに外部キーを追加します
/*添加外键约束*/ ALTER TABLE Stu_Cour ADD CONSTRAINT stu_FK1 FOREIGN KEY(stu_id) REFERENCES Student(stu_id); ALTER TABLE Stu_Cour ADD CONSTRAINT cour_FK2 FOREIGN KEY(cour_id) REFERENCES Course(cour_id);作成を完了します。
注: すでに追加されているデータ テーブルに外部キーを追加します:
- 構文:alter table table name addconstraint FK_ID 外部キー (外部キー フィールド名) REFERENCES 外観 Table name (対応するテーブルの主キーフィールド名)
;
alter table tb_active addconstraint FK_ID 外部キー(user_id) REFERENCES tb_user(id);
- 7. データベース エンジン (ストレージ エンジン)
データベースにアクセスするときは、手動アクセスでもプログラム アクセスでも、データベース ファイルを直接読み書きするのではなく、データベース エンジンのドキュメント。
リレーショナル データベースを例に挙げると、SQL ステートメントをデータベース エンジンに送信します。データベース エンジンは SQL ステートメントを解釈し、必要なデータを抽出して返します。したがって、訪問者にとって、データベース エンジンは SQL ステートメントのインタープリターです。
7.1 MYISAM エンジンと InnoDB エンジンの違い
主な違い:
##MYISAMは非トランザクション的に安全です。また、
InnoDBはトランザクション セーフであり、
NYISAMロックの粒度はテーブル レベルのロックですが、
InnoDB- は行レベルのロックをサポートしています。
-
#MYISAM
はフルテキスト インデックス作成をサポートしますが、InnoDB
はフルテキスト インデックス作成をサポートしません。 -
MYISAM
は比較的単純です。InnoDB
、小規模なアプリケーションでは、 MYISAM - ;
MYISAM
の使用を検討できます。 MYISAM - ストレージは多くの手間を省きます;
(6)
InnoDB
テーブルはMYISAM# よりも安全です## テーブル。データ損失が発生した場合に、非トランザクション テーブルをトランザクション テーブルに切り替えることができます。
- アプリケーション シナリオ:
<ul> <li> <code>MYISAM
は非トランザクション テーブルを管理し、高速なストレージと取得、および全文検索機能を提供します。 selectクエリを使用する場合は、
MYISAMがより適切な選択です。
- InnoDB
はトランザクション処理アプリケーションに使用され、
ACIDトランザクション サポートなどの多数の機能を備えています。アプリケーションで多数の
insertまたは
update操作を実行する必要がある場合は、マルチユーザー同時操作のパフォーマンスを向上させる
innodbを使用する必要があります。
パラダイム:
- 1NF: 各列がアトミックのままであることを確認します;
- 2NF: テーブル内の各列が主キー (結合主キー) に関連付けられていることを確認します。
- 3NF: テーブル内の各列が主キー (外部キー) に直接関連付けられていることを確認します;
- BCNF: 1NF に基づいて、非主属性は外部キーに依存できません。主キーのサブセット (3NF に基づいて主キー サブセットへの依存を排除) メイン コード サブセットへの依存);
- 4NF: 同じテーブル内の多対多リレーションシップの削除要求;
- 5NF: 最終構造から元の構造を再構築します;
以上がMySQLデータベースの基礎知識の備蓄(整理まとめ)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

MySQLはGPLライセンスを使用します。 1)GPLライセンスにより、MySQLの無料使用、変更、分布が可能になりますが、変更された分布はGPLに準拠する必要があります。 2)商業ライセンスは、公的な変更を回避でき、機密性を必要とする商用アプリケーションに適しています。

Myisamの代わりにInnoDBを選択する場合の状況には、次のものが含まれます。1)トランザクションサポート、2)高い並行性環境、3)高いデータの一貫性。逆に、Myisamを選択する際の状況には、1)主に操作を読む、2)トランザクションサポートは必要ありません。 INNODBは、eコマースプラットフォームなどの高いデータの一貫性とトランザクション処理を必要とするアプリケーションに適していますが、Myisamはブログシステムなどの読み取り集約型およびトランザクションのないアプリケーションに適しています。

MySQLでは、外部キーの機能は、テーブル間の関係を確立し、データの一貫性と整合性を確保することです。外部キーは、参照整合性チェックとカスケード操作を通じてデータの有効性を維持します。パフォーマンスの最適化に注意し、それらを使用するときに一般的なエラーを避けてください。

MySQLには、B-Treeインデックス、ハッシュインデックス、フルテキストインデックス、空間インデックスの4つのメインインデックスタイプがあります。 1.B-Treeインデックスは、範囲クエリ、ソート、グループ化に適しており、従業員テーブルの名前列の作成に適しています。 2。HASHインデックスは、同等のクエリに適しており、メモリストレージエンジンのHASH_TABLEテーブルのID列の作成に適しています。 3。フルテキストインデックスは、記事テーブルのコンテンツ列の作成に適したテキスト検索に使用されます。 4.空間インデックスは、地理空間クエリに使用され、場所テーブルのGEOM列での作成に適しています。

tocreateanindexinmysql、usethecreateindexstatement.1)forasinglecolumn、 "createdexidx_lastnameonemployees(lastname);" 2)foracompositeindexを使用して、 "createindexidx_nameonemployees(lastname、firstname);" 3); "3)、" 3)を使用します

MySQLとSQLiteの主な違いは、設計コンセプトと使用法のシナリオです。1。MySQLは、大規模なアプリケーションとエンタープライズレベルのソリューションに適しており、高性能と高い並行性をサポートしています。 2。SQLiteは、モバイルアプリケーションとデスクトップソフトウェアに適しており、軽量で埋め込みやすいです。

MySQLのインデックスは、データの取得をスピードアップするために使用されるデータベーステーブル内の1つ以上の列の順序付けられた構造です。 1)インデックスは、スキャンされたデータの量を減らすことにより、クエリ速度を改善します。 2)B-Tree Indexは、バランスの取れたツリー構造を使用します。これは、範囲クエリとソートに適しています。 3)CreateIndexステートメントを使用して、createIndexidx_customer_idonorders(customer_id)などのインデックスを作成します。 4)Composite Indexesは、createIndexIDX_CUSTOMER_ORDERONORDERS(Customer_Id、Order_date)などのマルチコラムクエリを最適化できます。 5)説明を使用してクエリ計画を分析し、回避します

MySQLでトランザクションを使用すると、データの一貫性が保証されます。 1)StartTransactionを介してトランザクションを開始し、SQL操作を実行して、コミットまたはロールバックで送信します。 2)SavePointを使用してSave Pointを設定して、部分的なロールバックを許可します。 3)パフォーマンスの最適化の提案には、トランザクション時間の短縮、大規模なクエリの回避、分離レベルの使用が合理的に含まれます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ホットトピック









