MySQLの詳細
6236 ワード
1.MySQLのトランザクション
(1)ストレージエンジンの紹介
紹介:クライアントがSQL文をサーバに送信すると、サーバ側はキャッシュ、構文チェック、検証に合格した後、下位層のソフトウェア組織を呼び出してデータベースからデータを照会し、クエリーした結果セットをクライアント側に返します.これらの下位層のソフトウェア組織はストレージエンジンです.MySQLのストレージエンジン:MySQL-MySQLの核心はストレージエンジンであり、MySQLはさまざまなストレージエンジンを設定することができ、異なるストレージエンジンはインデックス、ストレージ、ロックのポリシーで異なる. - Mysql5.5以前はmyisamストレージエンジンを使用しており、全文検索をサポートし、トランザクションをサポートしていません. - Mysql5.5以降はinnodbストレージエンジンを使用し、トランザクションおよび行レベルロックをサポートします.
(2)MySQLトランザクションの紹介
紹介:トランザクションは操作シーケンスであり、これらの操作はすべて行うか、しないか、分割できない作業単位です.2つ以上のSQL文が完了するビジネスでは、トランザクションを使用する必要があります.トランザクションの同期が原則で、効率が低いためです.トランザクションのACIDプロパティ:
注意:MySQLデータベース、dml操作は自動コミットを採用
(3)MySQLトランザクションの同時実行時に発生した問題
≪ダーティ・リード|emdw≫:あるトランザクションの実行範囲内で、別のトランザクションがコミットされていないデータが読み出されます. 解決:コミットされたデータを読み取り、あるデータベースでは別のトランザクションのコミット後のデータしか読めません.(Oracleのデフォルトのトランザクション独立性レベル) 解決:繰り返し読み取り可能(MySQLのデフォルトのトランザクション独立性レベル) 虚読み:あるトランザクションの読取り専用範囲内で、別のトランザクションによってデータが削除または追加され、複数回読み出されたデータが一致しない問題を解決する.≪解決|Resolution|emdw≫:シリアル化:すべての問題を解決しますが、速度が非常に遅く、同時トランザクションは使用できません. 注意:トランザクションの独立性レベルの表示:select@@tx_isolation;
2.MySQLのストレージプログラム
(1)MySQLのストレージプログラムの紹介
説明:サーバ側とのプログラムを実行します. 利点:開発を簡素化し、実行効率が比較的高い(検証によってサーバ側で直接使用できる) 欠点:サーバ側がこれらのストレージプログラムを保存するにはディスク領域を占有する必要がある;データの移行には、これらのストレージプログラムを移行する必要があります.デバッグおよびライターは、サーバ側では容易ではありません.ストレージ・プロシージャ、ストレージ関数、トリガ注意:ストレージ・プログラムはトランザクションを使用できません.
(2)ストレージプロセス
説明:ストレージ・プロシージャは、サーバ側で実行可能なコード・ブロックです.例:
せいぎょプロセスステートメント
(3)記憶関数
はサーバ側に格納され、戻り値があり、関数はSQLの一部として呼び出すことができます.
関数とストレージ・プロシージャの違い: -キーワードが異なる -ストレージ・プロシージャは独立した個体として実行でき、関数はSQLの一部としてのみ実行できます.
(4)トリガ
サーバ側に格納され、イベントによって呼び出され、パラメータを送信できません. イベントタイプ:増加、削除、改 構文:
例:
3.MySQLのテーブルのデザイン
(1)データベースの3つのパターン:
-1 NF:すべてのフィールドは原子的で、分割できません. -2 NF:プライマリ・キー以外のフィールドは、プライマリ・キーに関連付けられている必要があります(各テーブルには1つのものしか記述されていません).プライマリ・キー部分に関連付けられていない(プライマリ・キーを結合する場合に有効) -3 NF:プライマリ・キー以外のフィールドは、プライマリ・キーに関連付けられている必要があります(各テーブルには1つのものしか記述されていません).プライマリ・キー部分に関連付けられていない(プライマリ・キーを結合する場合に有効)
(2)テーブルの関係:
いちいち対応する
1対多:
多対多:設計方法:中間表を探して、2つの1対多の関係に変換する必要があります
(3)データベースの最適化: SQLの最適化 クエリーでは一般に*は使用されません.なぜなら、クエリー・レコードでは(*)が一般的に使用されるため、彼は*をカラム名に変換し、クエリー(時間のかかる) not null/nullを使用してインデックスを検索すると、インデックスが無効になります. インデックス列で関数を使用すると、インデックスが無効になります. インデックス列で計算すると、インデックスの失効も になります.インデックス列not|!=|<>を使用しないでください. なるべくorを使わないでunion を使うインデックス列でlikeを使用すると、インデックスの失効も になります.
existsとinの使用選択 existsプライマリ・クエリーを先に実行します.プライマリ・クエリーがフィルタリングされている場合は、exists を使用します. inサブクエリを先に実行します.サブクエリのフィルタリングが多い場合はinを使用します.
(1)ストレージエンジンの紹介
紹介:クライアントがSQL文をサーバに送信すると、サーバ側はキャッシュ、構文チェック、検証に合格した後、下位層のソフトウェア組織を呼び出してデータベースからデータを照会し、クエリーした結果セットをクライアント側に返します.これらの下位層のソフトウェア組織はストレージエンジンです.MySQLのストレージエンジン:MySQL-MySQLの核心はストレージエンジンであり、MySQLはさまざまなストレージエンジンを設定することができ、異なるストレージエンジンはインデックス、ストレージ、ロックのポリシーで異なる. - Mysql5.5以前はmyisamストレージエンジンを使用しており、全文検索をサポートし、トランザクションをサポートしていません. - Mysql5.5以降はinnodbストレージエンジンを使用し、トランザクションおよび行レベルロックをサポートします.
(2)MySQLトランザクションの紹介
紹介:トランザクションは操作シーケンスであり、これらの操作はすべて行うか、しないか、分割できない作業単位です.2つ以上のSQL文が完了するビジネスでは、トランザクションを使用する必要があります.トランザクションの同期が原則で、効率が低いためです.トランザクションのACIDプロパティ:
# :
BEGIN;
update t_account set money=money+100 where id =1;
update t_account set money=money-100 where id =2;
COMMIT;
#
BEGIN;
update t_account set money=money+100 where id =1;
update t_account set money=money-100 where id =2;
COMMIT;
注意:MySQLデータベース、dml操作は自動コミットを採用
#
show variables like 'autocommit';
#
set autocommit=0;
(3)MySQLトランザクションの同時実行時に発生した問題
≪ダーティ・リード|emdw≫:あるトランザクションの実行範囲内で、別のトランザクションがコミットされていないデータが読み出されます. 解決:コミットされたデータを読み取り、あるデータベースでは別のトランザクションのコミット後のデータしか読めません.(Oracleのデフォルトのトランザクション独立性レベル) 解決:繰り返し読み取り可能(MySQLのデフォルトのトランザクション独立性レベル) 虚読み:あるトランザクションの読取り専用範囲内で、別のトランザクションによってデータが削除または追加され、複数回読み出されたデータが一致しない問題を解決する.≪解決|Resolution|emdw≫:シリアル化:すべての問題を解決しますが、速度が非常に遅く、同時トランザクションは使用できません. 注意:トランザクションの独立性レベルの表示:select@@tx_isolation;
2.MySQLのストレージプログラム
(1)MySQLのストレージプログラムの紹介
説明:サーバ側とのプログラムを実行します. 利点:開発を簡素化し、実行効率が比較的高い(検証によってサーバ側で直接使用できる) 欠点:サーバ側がこれらのストレージプログラムを保存するにはディスク領域を占有する必要がある;データの移行には、これらのストレージプログラムを移行する必要があります.デバッグおよびライターは、サーバ側では容易ではありません.ストレージ・プロシージャ、ストレージ関数、トリガ注意:ストレージ・プログラムはトランザクションを使用できません.
(2)ストレージプロセス
説明:ストレージ・プロシージャは、サーバ側で実行可能なコード・ブロックです.例:
#
delimiter //
#
create procedure pro_book()
begin
#sql
select * from book;
select * from book where bid=3;
end //
#
call pro_book()
#
delimiter //
create procedure pro_book02(num int)
begin
select * from book where bid=num;
end ; //
--
call pro_book02(3)
#
delimiter //
create procedure pro_book03(num int,out v_name varchar(10))
begin
select bname into v_name from book where bid=num;
end ; //
-- , @v_name
call pro_book03(1,@v_name);
select @v_name;
#
delimiter //
create procedure pro_book04(num int)
begin
select bid into num from book where bid=num;
end ; //
--
set @v_id=3; --
call pro_book04(@v_id);
select @v_id;
せいぎょプロセスステートメント
#if
delimiter //
create procedure if_test(score int)
begin
--
declare myLevel varchar(20);
if score>80 then
set myLevel='A';
elseif score >60 then
set myLevel='B';
else
set myLevel='C';
end if;
select myLevel;
end; //
--
call if_test(70);
#while
delimiter //
create procedure while_test()
begin
declare i int ;
declare sum int ;
set i=1;
set sum =0;
while i<=100 do
set sum=sum+i;
set i=i+1;
end while ;
select sum;
end ;//
call while_test()
#loop
delimiter //
create procedure loop_test()
begin
declare i int ;
declare sum int ;
set i=1;
set sum =0;
--
lip:loop
if i>100 then
-- loop
leave lip ;
end if ;
set sum=sum+i;
set i=i+1;
end loop ;
select sum;
end ;//
call loop_test()
#repeat
delimiter //
create procedure repeat_test()
begin
declare i int ;
declare sum int ;
set i=1;
set sum =0;
repeat
set sum=sum+i;
set i=i+1;
--
until i>100
end repeat ;
select sum;
end ;//
call loop_test()
(3)記憶関数
はサーバ側に格納され、戻り値があり、関数はSQLの一部として呼び出すことができます.
** **:
delimiter //
create function func_01(num int)
--
returns varchar(20)
deterministic
begin
declare v_name varchar(20);
select bname into v_name from book where bid =num ;
return v_name;
end ; //
set @v_name=func_01(3);
select @v_name;
-- SQL
select * from book where bname=func_01(3);
関数とストレージ・プロシージャの違い: -キーワードが異なる -ストレージ・プロシージャは独立した個体として実行でき、関数はSQLの一部としてのみ実行できます.
(4)トリガ
サーバ側に格納され、イベントによって呼び出され、パラメータを送信できません. イベントタイプ:増加、削除、改 構文:
create trigger
(after|before) event(update|delete|insert)
on for each row ( )
begin
sql
end;
例:
delimiter //;
--
create trigger tri_test
after delete
--
on book for each row
begin
insert into book values(old.id,' ','zzy');
end;//
: :old、new,old ,
new , 。
3.MySQLのテーブルのデザイン
(1)データベースの3つのパターン:
-1 NF:すべてのフィールドは原子的で、分割できません. -2 NF:プライマリ・キー以外のフィールドは、プライマリ・キーに関連付けられている必要があります(各テーブルには1つのものしか記述されていません).プライマリ・キー部分に関連付けられていない(プライマリ・キーを結合する場合に有効) -3 NF:プライマリ・キー以外のフィールドは、プライマリ・キーに関連付けられている必要があります(各テーブルには1つのものしか記述されていません).プライマリ・キー部分に関連付けられていない(プライマリ・キーを結合する場合に有効)
(2)テーブルの関係:
いちいち対応する
# ×××
:
CREATE TABLE `t_people` (
`id` int(11) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
××× :
create table t_idcard(
card_number varchar(18) primary key,
create_date date,
p_id int unique,
foreign key (p_id) REFERENCES t_people(id)
)
: : ,
1対多:
:
create table t_emp(
eid int PRIMARY KEY,
ename varchar(50) not null,
job varchar(50),
deptno int ,
foreign key (deptno) REFERENCES t_dept(deptno)
)
:
create table t_dept(
deptno int primary key,
deptname varchar(50)
)
: :
多対多:設計方法:中間表を探して、2つの1対多の関係に変換する必要があります
(3)データベースの最適化: