1つはMySQLインデックス
(1)インデックスの概念
- インデックスはソートされたリストであり、インデックスの値とデータの値を含む行の物理アドレスが格納されます(ポインタを介してデータレコードのメモリアドレスを指すC言語のリンクリストと同様)。
- インデックスを使用した後、テーブル全体をスキャンせずに行のデータを見つけることができますが、最初にインデックステーブルからデータの行に対応する物理アドレスを見つけてから、対応するデータにアクセスすることで、のクエリ速度が向上します。データベース
- 索引は本の目次のようなもので、目次のページ番号に応じて必要な内容をすばやく見つけることができます。
- インデックスは、テーブル内の1つまたは複数の列の値を並べ替える方法です
- インデックス作成の目的は、テーブル内のレコードの検索または並べ替えを高速化することです。
(2)インデックスの役割
- 適切なインデックスを設定した後、データベースはさまざまな高速ポジショニングテクノロジーを使用して、クエリ速度を大幅に高速化します。これが、すべてを作成する主な理由です。
- テーブルが大きい場合、またはクエリに複数のテーブルが含まれる場合、インデックスを使用すると、クエリの速度が数千倍になります。
- データベースのIOコストを削減でき、インデックス作成によりデータベースの並べ替えコストも削減できます
- 一意のインデックスを作成することで、データテーブル内のデータの各行の一意性を確保できます。
- テーブルとテーブル間の接続を高速化できます
- グループ化と並べ替えを使用すると、グループ化と並べ替えの時間を大幅に短縮できます
インデックス作成の副作用:
- インデックスには追加のディスク容量が必要です
- MyISAMエンジンの場合、インデックスファイルとデータファイルは分離され、インデックスファイルはデータレコードのアドレスを保存するために使用されます
- InnoDBエンジンテーブルデータファイル自体がインデックスファイルです
- インデックスもそれに応じて変更されるため、データの挿入と変更に時間がかかります
(3)インデックス作成の原則
インデックスはデータベースクエリの速度を上げることができますが、すべての状況でインデックスを作成するのに適しているわけではありません。
インデックス自体がシステムリソースを消費するため、インデックスがある場合、データベースは最初にインデックスクエリを実行し、次に特定のデータ行を見つけます。インデックスが不適切に使用されると、データベースの負担が増大します。
に従い:
- テーブルの主キーと外部キーにはインデックスが必要です。主キーは一意であるため、外部キーは子テーブルの主キーに関連付けられており、クエリを実行するときにすばやく見つけることができます。
- 300行を超えるレコードを持つテーブルには、インデックスが必要です。インデックスがない場合は、テーブルを再度トラバースする必要があります。これは、データベースのパフォーマンスに深刻な影響を及ぼします。
- 他のテーブルに接続されることが多いテーブルは、接続フィールドでインデックスを作成する必要があります
- 一意性の低いフィールドはインデックス作成に適していません
- 頻繁に更新されるフィールドは、インデックスの作成には適していません
- where句に頻繁に現れるフィールド、特に大きなテーブルのフィールドには、インデックスを付ける必要があります。
- インデックスは、選択性の高いフィールドに基づいて作成する必要があります
- インデックスは小さなフィールドに作成する必要があります。大きなテキストフィールドや長いフィールドのインデックスは作成しないでください。
(4)インデックスの分類と作成
通常のインデックス:最も基本的なインデックスタイプで、一意性などの制限はありません
直接创建索引:
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
#(列名(length)):
length是可选项,下同。如果忽略 length 的值,则使用整个列的值作为索引。
如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾。
修改表方式创建:
ALTER TABLE 表名 ADD INDEX 索引名 (列名);
创建表的时候指定索引
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
一意のインデックス:通常のインデックスと同様ですが、一意のインデックス列の各値が一意である点が異なります。
一意のインデックスはnull値を許可します(主キーとは異なることに注意してください)。複合インデックスを使用して作成されている場合、列値の組み合わせは一意である必要があります。
一意のキーを追加すると、一意のインデックスが自動的に作成されます。
直接创建唯一索引:
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
修改表方式创建
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
创建表的时候指定
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));
主キーインデックス:PRIMARY(プライマリ)として指定する必要がある特別な一意のインデックスです
创建表的时候指定
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
修改表方式创建
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
複合インデックス(単一列インデックスと複数列インデックス):単一の列で作成されたインデックス、または複数の列で作成されたインデックスにすることができます
selectステートメントのwhere条件は左から右に順番に実行されるため、左端の原則を満たす必要があります。
したがって、selectステートメントを使用してクエリを実行する場合、where条件で使用されるフィールドの順序は次の順序と一致している必要があります。複合インデックス、そうでない場合、インデックスは有効になりません
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';
全文索引(FULLTEXT):ファジークエリに適しており、記事内のテキスト情報を取得するために使用できます
FULLTEXTインデックスはMyISAMエンジンでのみ使用できます。バージョン5.6以降、innodbエンジンはFULLTEXTインデックスもサポートします。
フルテキストインデックスは、CHAR、VARCHAR、またはTEXTタイプの列に作成できます。テーブルごとに許可されるフルテキストインデックスは1つだけです。
直接创建索引
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
修改表方式创建
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
创建表的时候指定索引
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT
使用全文索引查询
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');
(5)インデックスを表示する
show index from 表名;
show keys from 表名;
各フィールドの意味:
フィールド名 | フィールドの意味 |
---|---|
テーブル | テーブルの名前 |
Non_unique | インデックスに繰り返し単語を含めることができない場合は0、可能な場合は1です。 |
Key_name | インデックスの名前 |
Seq_in_index | 1から始まるインデックスの列番号 |
Column_name | 列名 |
照合 | 列は、値「A」(昇順)またはNULL(分類なし)でインデックスに格納されます。 |
カーディナリティ | インデックス内の一意の値の推定数 |
Sub_part | 部分的に索引付けされた列は、索引付けされた文字数です。列全体にインデックスが付けられ、NULLです |
パック | キーワードの圧縮方法を示します。圧縮されていない場合はNULL |
ヌル | 列にNULLが含まれている場合、その列にはYESが含まれています。そうでない場合、列にはNOが含まれます |
Index_type | 使用されるインデックスメソッド(BTREE、FULLTEXT、HASH、RTREE) |
コメント | 備考 |
(6)インデックスを削除します
直接删除索引
DROP INDEX 索引名 ON 表名;
修改表方式删除索引
ALTER TABLE 表名 DROP INDEX 索引名;
删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY;
2、MySQLトランザクション
(1)事務の概念
- トランザクションは、データベース操作コマンドのセットを含むメカニズムである操作シーケンスであり、すべてのコマンド全体とともにシステムに操作要求を送信または取り消します。つまり、このデータベースコマンドのセットは実行されるかどうかのいずれかです。実行
- トランザクションは分離できない論理的な作業単位です。データベースシステムで並行操作を実行する場合、トランザクションは最小の制御単位です。
- トランザクションは、複数のユーザーが銀行、保険会社、証券取引システムなどのデータベースシステムを同時に操作しているシナリオに適しています。
- トランザクションは、トランザクションの整合性を通じてデータの整合性を保証します
(2)トランザクションのACID特性
ACIDは、信頼性の高いデータベース管理システム(DBMS)
のトランザクションの4つの特性である、原子性、一貫性、分離、および耐久性を指します。これらは、信頼できるデータベースが持つべきいくつかの特性です。
原子性:トランザクションが分割できない作業単位であることを指し、トランザクション内の操作はすべて発生するか、発生しないかのいずれかです。
- トランザクションは完全な操作であり、トランザクションの要素は切り離せません。
- トランザクション内のすべての要素は、全体としてコミットまたはロールバックする必要があります。
- トランザクションのいずれかの要素が失敗すると、トランザクション全体が失敗します。
整合性:トランザクションの開始前とトランザクションの終了後にデータベースの整合性制約が破棄されないことを意味します
- トランザクションが完了すると、データは一貫した状態になっている必要があります。
- トランザクションが開始される前は、データベースに保存されているデータは一貫性のある状態です。
- 進行中のトランザクションでは、データに一貫性のない状態が存在する可能性があります。
- トランザクションが正常に完了すると、データを既知の一貫性のある状態に戻す必要があります。
分離:並行環境では、異なるトランザクションが同じデータを同時に操作する場合、各トランザクションには独自の完全なデータスペースがあります
- データを変更するすべての同時トランザクションは互いに分離されており、トランザクションは独立している必要があり、他のトランザクションに依存したり影響を与えたりしてはならないことを示しています。
- データを変更するトランザクションは、同じデータを使用する別のトランザクションが開始する前、または同じデータを使用する別のトランザクションが終了した後にデータにアクセスできます。
永続性:トランザクションが完了した後、トランザクションによってデータベースに加えられた変更はデータベースに永続化され、ロールバックされません。
- システムに障害が発生したかどうかを示し、トランザクション処理の結果は永続的です。
- トランザクションがコミットされると、トランザクションの効果はデータベースに永続的に保持されます。
トランザクション間の相互作用にはいくつかのタイプがあります。
- ダーティリード:トランザクションが別のトランザクションのコミットされていないデータを読み取り、このデータがロールバックされる可能性があります。
- 繰り返し不可の読み取り:トランザクション内の2つの同一のクエリは、異なるデータを返します。これは、クエリ中にシステム内の他のトランザクション変更がコミットされたことが原因です。
- ファントム読み取り:トランザクションはテーブル内のデータを変更します。この変更には、テーブル内のすべてのデータ行が含まれます。同時に、別のトランザクションもこのテーブルのデータを変更します。この変更は、データの新しい行をテーブルに挿入することです。次に、前のトランザクションを操作しているユーザーは、錯覚が発生したかのように、テーブルに変更されていないデータ行がまだあることに気付きます。
- 失われた更新:2つのトランザクションが同じレコードを同時に読み取ります。Aは最初にレコードを変更し、Bもレコードを変更します(BはAがレコードを変更したことを知りません)。Bがデータを送信した後、Bの変更結果は上書きされます。 Aの変更結果。
Mysqlとトランザクション分離レベル:
- コミットされていない読み取り:コミットされていないデータの読み取り:ダーティ読み取りを解決しません
- コミット済みの読み取り:送信されたデータの読み取り:ダーティ読み取りを解決できます
- 繰り返し可能な読み取り:再読み取り読み取り:ダーティ読み取りと繰り返し不可能な読み取りを解決できます-mysqlのデフォルト
- シリアル化可能:シリアル化:ダーティ読み取り、繰り返し不可能な読み取り、仮想読み取りを解決できます-ロックテーブルと同等です
mysql默认的事务处理级别是 repeatable read
而Oracle和SQL Server是 read committed
查询全局事务隔离级别:
show global variables like '%isolation%';
SELECT @@global.tx_isolation;
查询会话事务隔离级别:
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
设置全局事务隔离级别:
set global transaction isolation level read committed;
设置会话事务隔离级别:
set session transaction isolation level read committed;
概要:トランザクション管理では、原子性が基盤であり、分離が手段であり、一貫性が目標であり、永続性が結果です。
(3)トランザクション制御ステートメント
BEGIN 或 START TRANSACTION:显式地开启一个事务。
COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。
(4)setを使用して制御トランザクションを設定します
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值
自動送信がオンになっていない場合:
- 現在のセッションに接続されているmysqlのすべての操作は、rollback | commitを入力するまでトランザクションとして扱われます。現在のトランザクションは、終了とは見なされません。現在のトランザクションが終了する前に、新しいmysql接続は現在のセッションの操作結果を読み取ることができません。
自動送信が有効になっている場合:
- MySQLは各SQLステートメントをトランザクションとして扱い、自動的にコミットします。
3、MySQLストレージエンジン
(1)MyISAM
MyISAMテーブルは、次の3つの異なるストレージ形式をサポートしています。
- 静的(固定長)テーブル
静的テーブルはデフォルトのストレージ形式です。静的テーブルのフィールドはすべて非可変フィールドであるため、各レコードの長さは固定されています。このストレージ方法の利点は、ストレージが非常に高速で、キャッシュが簡単で、障害からの回復が容易なことです。欠点は、通常、動的テーブルよりも多くのスペースを占有します。 - 動的テーブル動的テーブルには可変フィールドが含まれ、レコードは固定長ではありません。このストレージの利点は、使用するスペースが少ないことですが、レコードを頻繁に更新および削除すると断片化が発生し
ます。OPTIMIZETABLEステートメントまたはmyisamchkを定期的に実行する必要があります。 -rはパフォーマンスを向上させるコマンドであり、障害が発生したときに回復することは比較的困難です。 - 圧縮テーブル圧縮テーブルはmyisamchkツールによって作成され、非常に小さなスペースを占有します。各レコードは個別に圧縮されるため、アクセスコストはごくわずかです。
MyISAMの本番シナリオ:
- 会社の事業は事務の支援を必要としません
- 大量のデータを一方的に読み書きするサービス
- MyISAMストレージエンジンのデータの読み取りと書き込みは頻繁であり、シナリオには適していません
- 比較的低ビジネスへの読み取りと書き込みの同時アクセスを使用する
- データの変更が比較的少ないビジネス
- 非常に高いデータビジネスの一貫性を必要としないビジネス
- サーバーのハードウェアリソースは比較的貧弱です
(2)InnoDB
InnoDBの機能:
- 読み取りと書き込みのブロックは、トランザクション分離レベルに関連しています
- インデックスとデータを非常に効率的にキャッシュできます
- テーブルと主キーはクラスターに格納されます
- Oracleデータベースと同様に、パーティションと表スペースをサポートします
- 外部キー制約をサポートします。フルテキストインデックスは5.5より前ではサポートされていません。フルテキストインデックスは5.5以降でサポートされています。
InnoDBの該当する本番シナリオ:
- ハードウェアリソース要件が比較的高い場合
行レベルのロックですが、全表スキャンは引き続きテーブルレベルのロックになります。たとえば、ユーザーが '%lic%'のようにテーブルセットa = 1を更新します。
InnoDBは、テーブルからのselect count()など、テーブル内の行数を保存しません。InnoDBは、テーブル全体をスキャンして行数を計算する必要がありますが、MyISAMは保存された行数を読み取るだけです。
count()ステートメントにwhere条件が含まれている場合、MyISAMもテーブル全体をスキャンする必要があることに注意してください。自己成長フィールドの場合、InnoDBにはこのフィールドのみのインデックスが含まれている必要がありますが、複合インデックスは他のインデックスと一緒に構築できます。 MyISAMテーブルのフィールド
(2)ストレージエンジンの操作コマンド
#查看系统支持的存储引擎
show engines;
#查看表使用的存储引擎
方法一:
show table status from 库名 where name='表名'\g
方法二:
use 库名;
show create table 表名;
#修改存储引擎
1.通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;
2.通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
systemctl restart mysql.service
注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
3.通过 create table 创建表时指定存储引擎
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;