序文
前回の記事では、アプリケーションの最適化、mysqlのクエリキャッシュの最適化、mysqlのメモリ管理の最適化、およびmysqlの同時実行パラメータの調整について紹介しました。次に、ロックの競合と、行ロックおよびテーブルロックの関連コンテンツを含む、MySQLのロックを紹介します。さらに、SQLで一般的に使用されるいくつかの手法を紹介します。最初に、ロックの関連コンテンツを紹介します。
1つ、MySQLロック
1.ロックの概要
ロックは、コンピューターが複数のプロセスまたはスレッドによる同時アクセスを調整する特定のリソースメカニズムです。データベースでは、システムのコンピューティングリソース(CPU、RAM、I / Oなどを含む)の競合に加えて、データは多くのユーザーによって共有されるリソースでもあります。データへの同時アクセスの一貫性と有効性を確保する方法は、すべてのデータベースが解決しなければならない問題であり、ロックの競合もデータベースへの同時アクセスのパフォーマンスに影響を与える重要な要素です。この観点から、ロックはデータベースにとって特に重要であり、より複雑です。
2.ロック分類
データ操作の粒度 から、次のカテゴリに分類できます。
- ①テーブルロック:操作中、テーブル全体がロックされます
- ②行ロック:運転中、現在の運転行がロックされます
データ操作のタイプ は、次のカテゴリに分類されます。
- ①読み取りロック(共有ロック):同じデータに対して、相互に影響を与えることなく、複数の読み取り操作を同時に実行できます。
- ②。書き込みロック(排他ロック):現在の操作が完了する前に、他の書き込みロックと読み取りロックをブロックします。
3.MySQLロック
他のデータベースと比較して、MySQLのロックメカニズムは比較的単純です。その最も顕著な特徴は、異なるストレージエンジンが異なるロックメカニズムをサポートすることです。次の表に、各ストレージエンジンのロックサポートステータスを示し
ます。MySQLItの3種類のロックの特性大まかに次のようにまとめることができます。
上記の特性から、一般的にどちらのロックが優れているかを判断することは困難であり、特定のアプリケーション特性の観点からどちらのロックがより適しているかだけを判断できます。ロックの観点からのみ:テーブルレベルのロックは、インデックス条件に基づいてデータを更新するWebアプリケーションなどのクエリベースのアプリケーションに適していますが、行レベルのロックは、インデックス条件に基づいた少量の異なるデータ。また、一部のオンライントランザクション処理(OLTP)システムなどの同時クエリアプリケーションがあります。
4.MyISAMテーブルロック
MyISAMストレージエンジンはテーブルロックのみをサポートします。これは、MySQLの最初のいくつかのバージョンでサポートされている唯一のロックタイプです。
- 1、
クエリを実行するMyISAMのテーブルロックを増やす方法(SELECT
前)は、このプロセスに関係するテーブル書き込みロックに自動的に前UPDATE
にDELETE
、INSERT
すべてのテーブルと更新操作(、など)に関係する読み取りロックを自動的に与えます。ユーザーなし介入が必要です。したがって、ユーザーは通常、LOCK TABLE
コマンドを直接使用してMyISAMテーブルの表示をロックする必要はありません。具体的なコマンドは次のとおりです。
加表锁:lock table table_name read;
加写锁:lock table table_name write;
まず、という名前のtb_book
テーブルを作成し、いくつかのデータを挿入します。具体的なコードは次のとおりです。
create datebase demo_03 default charset=utf8mb4;
use demo_03;
create table `tb_book`(
`id` int(11) auto_increment,
`name` varchar(50) default null,
`publish_time` date default null,
`status` char(1) default null,
primary key(`id`)
)engine=myisam default charset=utf8;
insert into tb_book(id, name, publish_time, status)values(null, 'mysql从入门到精通','2020-01-01','1');
insert into tb_book(id, name, publish_time, status)values(null, 'java从入门到精通','2020-02-02','0');
create table `tb_user`(
`id` int(11) auto_increment,
`name` varchar(50) default null,
primary key(`id`)
)engine=myisam default charset=utf8;
insert into tb_suer(id, name) values(null, 'stefan');
insert into tb_suer(id, name) values(null, 'napoleon');
- 2.書き込みロックケース
は、tb_bookテーブルの書き込みロックを取得します
lock table tb_book write;
クエリ操作を実行する
select * from tb_book;
実行結果は次のとおりです。
クエリ操作は正常に実行されます。
更新操作を実行します
update tb_book set name = 'java编程思想(第二版)' where id = 1;
実行結果は次のとおりです。
更新操作は正常に実行されます。
したがって、ロックモードの相互互換性を
表に示します。上記の表からわかるように、次のようになります。
1)MyISAMテーブルの読み取り操作は、同じテーブルへの他のユーザーの読み取り要求をブロックしませんが、同じテーブルへの書き込み要求をブロックします
。2)、MyISAMテーブルの書き込み操作は、他のユーザーをブロックします。同じテーブルの読み取りおよび書き込み操作。
つまり、読み取りロックは書き込みをブロックしますが、読み取りはブロックしません。書き込みロックは、読み取りと書き込みの両方をブロックします。さらに、MyISAMの読み取り/書き込みロックスケジューリングは書き込み優先です。これが、書き込みロック後、他のスレッドが操作を実行できず、多数の更新が行われるため、MyISAMが書き込みプライマリテーブルのストレージエンジンとして適していない理由です。 Get the lockのクエリが困難になり、永続的なブロックが発生します。
- 3.ロックの競合を確認します
show open tables;
実行結果は以下のとおりです。
- In_user:テーブルが現在クエリによって使用されている回数。数値がゼロの場合、テーブルは開いていますが、現在使用されていません。
- Name_locked:テーブル名がロックされているかどうか。名前ロックは、テーブルやその他の操作をキャンセルまたは名前変更するために使用されます。
show status like 'Table%';
実行結果は以下のとおりです。
Table_locks_immediate:テーブルレベルのロックをすぐに取得できる回数を示します。ロックをすぐに取得するたびに、値が1
ずつ増加します。Table_locks_waited:テーブルレベルのロックをすぐに取得できない回数を示します。待つ必要があります。待つたびに、値は1ずつ増加します。この値Highは、より深刻なテーブルレベルのロック競合があることを示します。
5.InnoDB行ロック
行ロックの特性:InnoDBストレージエンジンへのバイアス、高いオーバーヘッド、遅いロック、デッドロックが発生する、ロックの粒度が最小、ロックの競合の可能性が最も低く、同時実行性が最も高い。InnoDBとMyISAMには2つの最大の違いがあります。1つはトランザクションをサポートすることです。代わりに、行レベルのロックを使用します。
トランザクションは、SQLステートメントのセットで構成される論理処理ユニットです。トランザクションには、以下の4つの特性があり、略してトランザクションACID属性と呼ばれます。
同時トランザクション処理によって引き起こされる問題
- 1.トランザクション分離レベル
上記の増加したトランザクション同時実行性の質問を解決するために、データベースはこの問題を解決するための特定のトランザクション分離メカニズムを提供します。データベーストランザクションの分離が厳密であるほど、同時実行の副作用は小さくなりますが、トランザクションの分離では基本的にトランザクションをある程度「シリアル化」するために使用されるため、支払われる価格は高くなります。これは明らかに「同時実行」と矛盾します。
データベースの分離レベルには、低から高まで4つあり、コミットされていない読み取り、コミットされた読み取り、繰り返し可能な読み取り、シリアル化可能です。これらの4つのレベルは、ダーティ書き込み、ダーティ読み取り、繰り返し不可能な読み取り、ファントム読み取りの問題を1つずつ解決できます。 1。
ここで注意する必要があります。√は表示される可能性があることを意味し、xは表示されないことを意味します。MySQLデータベースのデフォルトの分離レベルはです。viewRepeatable read
メソッドは次のとおりです。
show variables like 'tx_isolation';
実行結果は次のとおりです。次のように
テーブルロックを作成する必要があります。
create table test_innodb_lock(
id int(11),
name varchar(16),
sex varchar(1)
)engine=innodb default charset=utf8;
insert into test_innodb_lock values(1, '100', '1');
insert into test_innodb_lock values(3, '3', '1');
insert into test_innodb_lock values(4, '400', '0');
insert into test_innodb_lock values(5, '500', '1');
insert into test_innodb_lock values(6, '600', '0');
insert into test_innodb_lock values(7, '700', '0');
insert into test_innodb_lock values(8, '800', '1');
insert into test_innodb_lock values(9, '900', '1');
insert into test_innodb_lock values(10, '200', '0');
create index idx_test_innodb_lock_id on test_innodb_lock(id);
create index idx_test_innodb_lock_name on test_innodb_lock(name);
- 2.行ロックの基本的なデモンストレーションは、
最初に自動送信機能をオフにします
set autocommit = 0;
実行結果は次のとおりです。
すべてのデータを正常に照会できます。
select * from test_innodb_lock;
実行結果は次のとおりです
。ID3のデータをクエリします。
select * from test_innodb_lock where id = 3;
実行結果は次のとおりです
。ID3でデータを更新します。
update test_innodb_lock set name = 'A1' where id = 3;
実行結果は次のとおりです。
コミット、ブロック解除、および通常の更新を介してトランザクションを送信します
commit;
実行結果は次のとおりです。
操作がすべて同じ行のデータであることを確認するのは難しくありません。次に、異なる行のデータを示します。
update test_innodb_lock set name = 'B1' where id = 3;
update test_innodb_lock set name = 'C1' where id = 5;
実行結果は以下のとおりです。
- 3.インデックス行ロックがテーブルロックにアップグレードされて
いない場合、データがインデックス条件を介して取得されない場合、InnoDBはテーブル内のすべてのレコードをロックし、実際の効果はテーブルロックと同じです。現在のテーブルのインデックスを表示する
show index from test_innodb_lock;
実行結果は次のとおりです。
最初にトランザクションの自動コミットをオフにします。
set autocommit = 0;
実行結果は次のとおりです。
次にupdateステートメントを実行します。
update test_innodb_lock set sex = '2' where name = 400;
update test_innodb_lock set sex = '2' where id = 9;
次に、更新ステートメントを実行し、
最後にトランザクションをコミットします
commit;
次に、更新ステートメントを実行します
- 4.ギャップロックの危険性:
等しい条件の代わりに範囲条件を使用してデータを取得し、共有ロックまたは排他ロックを要求すると、InnoDBは、条件を満たす既存のデータをロックしますが、条件範囲内のキー値については、既存のレコードは「ギャップ(GAP)」と呼ばれ、InnoDBもこの「ギャップ」をロックします。このロックメカニズムは、いわゆるギャップロック(ネクストキーロック)です。詳細は次のとおりです。
- 5.InnoDB行ロックの競合
show status like 'innodb_row_lock%';
実行結果は以下のとおりです。
- Innodb_row_lock_current_waits:現在待機しているロックの数
- Innodb_row_lock_time:システムの起動以降にシステムがロックされている合計時間
- Innodb_row_lock_time_avg:各待機に費やされた平均時間
- Innodb_row_lock_time_max:システムが起動してから最も長い時間待機するのにかかる時間
- Innodb_row_lock_waits:システムが起動してから現在までの待機の総数
待機回数が多く、待機時間が短くない場合は、なぜシステム内で待機が多いのかを分析し、分析結果に基づいて最適化計画を立てる必要があります。
つまり、InnoDBストレージエンジンは行レベルのロックを実装しているため、ロックメカニズムの実装によるパフォーマンスの低下はテーブルロックよりも高くなる可能性がありますが、全体的な同時処理機能の点ではMyISAMテーブルロックよりもはるかに優れています。の。システムの同時実行性が高い場合、InnoDBの全体的なパフォーマンスには、MyISAMと比較して明らかな利点があります。ただし、InnoDBの行レベルのロックには脆弱な側面もあります。不適切に使用すると、InnoDBの全体的なパフォーマンスがMyISAMのパフォーマンスよりも高くなるだけでなく、さらに悪くなる可能性があります。次は最適化の提案です:
- インデックス付けされていない行ロックからテーブルロックへのアップグレードを回避するために、可能な限り、すべてのデータ取得はインデックスを介して完了することができます。
- ロックの範囲を最小限に抑えるために、インデックスを合理的に設計します
- ギャップロックを回避するために、インデックス条件とインデックス範囲を可能な限り最小化します
- トランザクションサイズを制御し、ロックされたリソースの量と時間の長さを減らしてみてください
- 可能な限り低レベルのトランザクション分離を使用します(ただし、ビジネスレベルの要件を満たす必要があります)。
2つの一般的に使用されるSQLスキル
1.SQLの実行順序
ステートメントを作成するプロセスは次のとおりです。
select distinct <select list>
from <left_table> <join_type>
join <right_table> on <join_condition>
where <where_condition>
group by <grop_by_list>
having <having_condition>
order by <order_by_condition>
limit <limit_params>;
実行プロセスは次のとおりです。
from <left_table>
on <join_condition>
<join_type> join <right_table>
where <where_condition>
group by <grop_by_list>
having <having_condition>
select distinct <select list>
order by <order_by_condition>
limit <limit_params>;
2.MySQLのさまざまな機能
正規表現とは、特定の構文規則に準拠する一連の文字列を記述または照合するために使用される単一の文字列を指します。
具体的なコマンドは次のとおりです。
select * from emp where name regexp '^T';
select * from emp where name regexp '2$';
select * from emp where name regexp '[uvw]';
次は、MySQLの数学的加算などの一連の関数です。具体的には次のとおりです。
文字列関数、具体的には次のとおりです。
日付関数、具体的には次のとおりです。
最後に、MySQL集計関数、具体的には次のとおりです。
総括する
前回の記事では、アプリケーションの最適化、mysqlのクエリキャッシュの最適化、mysqlのメモリ管理の最適化、およびmysqlの同時実行パラメータの調整について紹介しました。この記事では、ロックの競合や、行ロックとテーブルロックの関連コンテンツなど、MySQLのロックについて紹介します。さらに、SQLステートメントの実行順序やSQLステートメントの実行順序など、SQLで一般的に使用されるいくつかの手法を紹介します。 SQLの主な機能。したがって、mysqlは非常に重要なスキルです。コンピューター内のほとんどすべてのジョブにはmysqスキルが必要です。したがって、特別な習熟が必要です。人生は終わりがなく、闘いは終わりがありません。私たちは毎日一生懸命働き、一生懸命勉強し、常に能力を向上させ、何かを学ぶと信じています。いい加減にして!!!