もちろん、私の初めてのファンのために用意されたMySQLです -> Yibao、
上級者向け記事を読んだ小さな友達のためにクリックしてください! ! ! !
高度な MySQL - インデックス
1. MySQL を起動してデータをバックアップします。
1.1 MySQL サービスを開始します。
- mysql サービスを開始/停止する cmd コマンド ライン: net start/stop mysql (管理者として実行)
1.2 MySQL クライアントへのログイン
1.2.1 ローカル MySQL サービスへのログイン
-
コマンドライン入力:
mysql -u ルート -p
パスワード: ルート
1.2.2 他人のMySQLサービスへのリモートログイン(設定ファイルの設定が必要)
- mysql -hip (ローカル マシンの 127.0.0.1 などの IP アドレス) -uroot -p (接続先のパスワード)
1.3 MySQL クライアントを終了する
- 終了/終了
1.4 データベースファイルのバックアップと実行
- SQL ファイルのバックアップ: mysqldump -uroot -p パスワード バックアップ データベース名 > パス (例: mysqldump -u root -p ユーザー パスワード --databases dbname > mysql.dbname)
- SQL ファイルの復元/実行: ソース SQL ファイルのパス
2. データベースの用語と操作
- DDL (Data Definition Language) データ定義言語 (Data Definition Language) は、データベースとテーブルを操作します。
- DML (Data Manipulation Language Data Manipulation Language) データの追加、削除、変更、およびチェック
- DQL (Data Query Language Data Query Language) は、データのクエリに使用されます
- DCL (データ制御言語データ制御言語) 承認、アクセス許可、およびセキュリティ アクセス
2.1.DDL運用データベースとテーブル
(作成、取得(クエリ)、更新、削除) データベースとテーブルの操作
2.1.1 データベースの運用
- すべてのデータベースを表示: データベースを表示します。
- 作成されたデータベースを表示します: show create database database name;
- データベースを作成します: データベース データベース名を作成します。
- データベースを作成する前に、データベースが存在するかどうかを判断します。データベース名が存在しない場合はデータベースを作成します。
- データベースを作成し、文字エンコーディング形式を設定します: create database database name character set gbk;
- データベースの文字セットを変更します。alter database database name character set character set name (utf8);
- データベースの削除: データベース データベース名をドロップします; (データベース名が存在する場合はデータベースをドロップします。最初にデータベースが存在するかどうかを判断します)
- データベースの切り替え: データベース名を使用します。
- 現在使用中のデータベースを照会します: select database();
2.1.2 操作データシート
テーブルを作成:
- 単一行コメント: #…
- 複数行コメント: / … /
create table tablename(
字段1 数据类型 约束1 约束2
字段2 数据类型 约束
…
);
如 :
create table employee(
id int primary key auto_increment, #id主键且自增
name varchar(10) not null,
sex varchar(5) not null,
department varchar(30) not null
)auto_increment=2; set @@ auto_increment_increment=3
- n から始まる auto_increment=n を設定します。
- 自動インクリメント セット @@ auto_increment_increment=m、ステップ サイズは m です。
- データベース内のすべてのテーブルの名前を照会します。
- クエリ テーブル構造: desc テーブル名;
- テーブルの作成: テーブルのテーブル名を作成します (列名 1 データ型 1、列名 2、データ型 2...);
- テーブルのコピー: テーブル名 1 をテーブル名 2 のように作成します。
- テーブルのデータをクリアします。テーブル名から削除します。
- テーブルの削除: テーブル名が存在する場合はテーブルを削除します。
2.1.3 データ列の操作
- テーブル名を変更します: テーブル テーブル名の名前を新しいテーブル名に変更します。
- テーブルのキャラクター作成情報を表示します: show create table テーブル名;
- テーブルの文字セットを変更します: テーブル テーブル名文字セット文字セットを変更します。
- 列を追加: テーブル テーブル名を変更し、列名のデータ型を追加します。
- 列名を変更します。テーブル テーブル名を変更します。古い列名を変更します。新しい列名のデータ型を変更します。
- 列のデータ型の変更: テーブル テーブル名の変更 列名のデータ型の変更;
- 列の削除: テーブル テーブル名を変更し、列名を削除します。
2.2 DDLデータの追加・削除・修正・確認
DML (テーブル内のデータの追加、削除、変更、およびクエリ) データの追加、削除、および変更
- データの追加: テーブル名に挿入 (列名 1、列名 2...) 値{...};
- データの削除: テーブル名 where 条件から削除します。
- すべてのレコードを削除: テーブル名から削除;
- テーブルを削除し、同じ名前の空のテーブルを作成します (より効率的) : テーブル table name を切り捨てます。
- データの変更: テーブル名セットの列名 1 = 値 1、列名 2 = 値 2 の条件を更新します。
2.3 DQL クエリ データ
2.3.1 基本的な文法 文法:
select 字段1,字段2....(字段列表)
from 表一,表二....(表名列表)
where 条件1,条件2...(条件列表)
group by 分组字段
having 分组之后的条件
order by 按什么字段排序
limit 6 分页限定
-
すべての情報をクエリ: select * from table name;
-
(個別) 同じデータを削除します。たとえば、学生から個別の列名を選択します。
-
(との間) (との間) : など: select * from stu where age between 20 and 30;
-
(in/not in)集合之中:select * from stu where age in(18,19,20);
-
クエリで列のエイリアスを使用します。select column name *AS new column name form table name where query condition;*
-
(null) : select * from stu where id is null /is not null;
-
(like) fuzzy query select * from table name where field name like 対応する値 (部分文字列), (* like,単一の任意の文字 % 複数の任意の文字)
1 の初めに良い学生をクエリします。「1%」のような学生 ID から * を選択します。
-
(order by) sorting (superimposed) : select * from stu order by math asc/desc, English asc; (desc 降順)
-
集計関数:
- count 関数: select count(ifnull(name,0)) from stu; (自動的に null を除外します)
- count(*)//データの行数
- max/min/sum/avg (maximum/lowest/sum/average): stu から max(math) を選択;
- 文字列 s のすべての文字を大文字に変更します
- 現在の日付を取得します: curdate();
- 現在の時刻を取得します: curtime();
- 現在の日付と時刻を取得します: now();
-
( group by) グループ クエリ(クエリ フィールドは、集計関数またはグループ フィールドのみにすることができます)
基本的な構文: フィールド名リスト フォーム テーブル名を選択します。ここで、制約条件はフィールド名でグループ化されます。
例: stu グループから性別の平均 (数学) を選択する; 男性と女性の平均スコアを照会する
-
limit paging query : select * from stu limit 3; (3個のデータ)
-
where と having の違い:
- グルーピング前に判断され、グルーピング後に有が判断される場合)
- Where の後に集約関数を続けることはできませんが、その後に集約関数を続けることができます
1.select sex,avg(math) from stu where math>70 group by sex;(分数>70分(分组之前))
2.select sex,avg(math),count(id) from stu where math>70 group by sex having count(id);(分数>70分 人数>2(分组之后))
2.3.2 接続クエリ
- 暗黙のインライン: select * from emp,dept where dept.id=emp.id;
- 明示的なインライン化: select * from emp inner join dept on emp.id=dept.id;
外部結合:
外部結合クエリで接続に参加するテーブルはマスターとスレーブに分割され、マスター テーブルのデータの各行はスレーブ テーブルのデータ列と一致し、接続条件を満たすデータは結果セットに直接返されます。 . 接続条件を満たさない列は削除されます. null値を埋めて結果セットに戻ります.
-
左外部結合(クエリはすべてのレコードまたは左側のテーブルの交差) であり、右側のレコードは null で埋められます。
例 : t1 として emp から t1.*,t2.name を選択し、t1.id=t2.id で t2 として部門に参加します。
-
右外部結合(右外部結合には、右テーブルの一致するすべての行が含まれ、右テーブルの一部の項目には左テーブルに対応する項目がなく、NULL 値が入力されます)。
例: t1.id=t2.id で t1 として emp から t1.*,t2.name を選択し、dept を t2 として結合します。
2.4 DCL 承認、権限、およびセキュリティ アクセス
-
ユーザーの作成: 'パスワード' で識別されるユーザー 'ユーザー名'@'ホスト名 (% すべてのホストではない)' を作成します。
-
ユーザーの削除: ユーザー 'ユーザー名'@'ホスト名' を削除します。
-
ユーザーパスワードの変更: update user set password = password('new password') where user = 'username';
'username'@'hostname' のパスワードを設定します。user='username';
-
ユーザー権限を確認してください: show Grants for 'username'@'hostname';
-
パーミッションの付与: 'username'@'hostname' にパーミッション リストを付与;
パーミッション リスト: 削除、更新、stu の選択 -
任意のデータベースとテーブルに対するすべての権限を付与し、すべての権限を. to 'username'@'hostname'; に付与します。
-
権限の取り消し: データベース名の権限リストを取り消します.テーブル名 from 'username'@'hostname';
3. 制約:
テーブル内のデータを制限して、データの正確性、有効性、および整合性を確保します
基本的な構文:
-
テーブルが作成されます。alter table table name modify column name type constraint;
-
テーブルはまだ作成されていません。フィールドの制約: id int 制約 (主キー auto_increment にすることができます)
-
主キー (特殊) 一意の制約を削除: テーブル テーブル名を変更し、主キーを削除します。
-
null でない (null でない制約) : テーブル テーブル名を変更し、列名の型を null 以外に変更します。
-
ユニーク (特別) ユニーク制約を削除します。
-
auto_increment (自動成長)例 id 自動成長 id int 主キー auto_increment
-
autogrow の削除 テーブル stu の変更 id int の変更;
-
(外部キー) テーブル作成時に外部キーを追加: 制約 外部キー名 外部キー (外部キー列名) 参照 主テーブル名 (主テーブル列名)
- 外部キーの追加 (テーブルが構築されます) : テーブル テーブル名の変更 制約の追加 外部キー名 外部キー (外部キー列名) 参照 メイン テーブル名 (メイン テーブル列名)
- 外部キーの削除: テーブル テーブル名を変更し、外部キー列名を削除します。
如: create table grade( id int(5) primary key,auto_increment name varchar(5) ); insert into stu(name) valuse('大一','大二'); create table stu( id int(5) primary key, name varchar(5) not null, gradeid int(5), #添加 grade表的外键 constraint fk_id forrign key (grandid) references grade(id) )
-
Cascade (update/delete) : (外部キー追加と同時にカスケード操作) alter table table name add constraint 外部キー名 external key (foreign key column name) references main table name (main table column name) on update cascadeカスケード削除時。
4.事務
複数のステップを含むビジネス オペレーションがトランザクションによって管理される場合、これらのオペレーションは同時に成功するか、同時に失敗します。
- トランザクションを開始します: トランザクションを開始します。
- トランザクションをコミットします: commit
- ロールバック: ロールバック;
例:
start transaction
....(业务逻辑)
commit
成功した場合
失敗し、ロールバック (ロールバック)
- select @@autocommit; (トランザクション 1 自動送信 0 手動送信のデフォルトの送信方法を確認するためのクエリ)
- トランザクションのデフォルトのコミット方法を変更します: set @@autocommit =0;
トランザクションの 4 つの主要な特徴:
- アトミシティ(分割できない演算の最小単位)
- 永続性(トランザクションのコミットまたはロールバック、データベースの永続性によるデータの保存)
- 分離(トランザクションは互いに独立しています)
- 一貫性(取引操作の前後で合計金額が変わらないこと)
分離: 複数のトランザクションは分離され、互いに独立していますが、複数のトランザクションが同じデータのバッチで動作する場合、いくつかの問題が発生し、異なる分離レベルを設定することで問題を解決できます。
同じデータを読み取る複数のスレッドには問題があります。
- Read dirty : トランザクションは、別のトランザクションによってコミットされていないデータを読み取ります
- Non-repeatable read (virtual read) : 同じトランザクションで、2 回読み込んだデータが異なる
- ファントム読み取り: トランザクション操作 (DML) データ テーブル内のすべてのレコード、別の書店がデータの一部を追加します。次に、最初のトランザクションはそれ自体の変更を照会できません
分離レベル 1->4 セキュリティが高いほど、効率は低くなります。
- コミットされていない読み取り(コミットされていない読み取り) は、1、2、3 の問題を生成します
- コミットされた読み取りで2 つ、3 つの問題が発生する
- 繰り返し可能な読み取り(再現性) は 3 つの問題を引き起こします
- serializable (シリアル化、テーブルのロック) はすべての問題を解決します
データベース データ分離レベルのクエリ: @@transaction_isolation を選択;
データベース分離レベルの設定: グローバル トランザクション分離レベルの分離レベルの設定; (mysql を再起動する必要があります)
楽観的ロック:
常に問題ないと思って何をしてもロックしない、問題があれば再度値テストを更新する
楽観的ロックの実装方法 (最下層は CAS) の手順は次のとおりです。
- レコードをフェッチするときに、現在のバージョンを取得します
- 更新するときは、このバージョンを持参してください
- 更新を実行するときは、version = newVersion を設定します。ここで、version = oldVersion
- バージョンが正しくない場合、アップデートは失敗します
悲観ロック:
常に問題が発生すると考えて、何をしてもロックされてから動作する
5.索引
インデックスは、MySQL がデータを効率的に取得するのに役立つデータ構造です。より一般的に言えば、データベース インデックスは本の前にある目次のようなもので、データベースのクエリ速度を高速化できます。一般的に言えば、インデックス自体も非常に大きく、すべてをメモリに格納することは不可能であるため、インデックスはディスク上のファイルに格納されることがよくあります(別のインデックス ファイルに格納される場合もあれば、まとめて格納される場合もあります)。データファイル内のデータで)データ量が多い場合、クエリ時間の短縮効果は明らかです
- 利点: データ検索の効率を向上させ、データベースの IO コストを削減し、インデックス列を介してデータを並べ替え、データ並べ替えのコストを削減し、CPU 消費を削減できます。order by ステートメントに対応して、インデックス列の順序に従ってソートすると、効率が大幅に向上します。
- 欠点: インデックスはディスク領域を占有します. インデックスはクエリの効率を向上させますが, テーブルの更新の効率を低下させます. たとえば、テーブルが追加、削除、または変更されるたびに、MySQL はデータを保存するだけでなく、対応するインデックス ファイルも保存または更新します。
インデックス名の命名形式は次のとおりです。テーブル名_フィールド名
5.1 インデックス操作:
-
Create index (ordinary index, repeatable) : create index index name on table name ('field name'); など create index stu_name on student(name);
-
インデックスの削除: インデックス stu_name をドロップします。
-
テーブルのインデックスを表示: table_name (テーブル名) からインデックスを表示
-
一意のインデックス: 一意
create unique index 索引名 on 表名(列名); create unique index ind_name on school(phone);
-
ビットマップ (カテゴリ) インデックス: ビットマップ
数据量比较大,基数比较小 比如:男/女 create bitmap index 索引名 on 表名(列名); create bitmap index ind_sid on student(sid);
作成するのは簡単ではありません、小さな友達を見た後、3連チャントを振ってみましょう