MySQLの詳細


1.MySQLのトランザクション
(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)データベースの最適化:
  • SQLの最適化
  • クエリーでは一般に*は使用されません.なぜなら、クエリー・レコードでは(*)が一般的に使用されるため、彼は*をカラム名に変換し、クエリー(時間のかかる)
  • not null/nullを使用してインデックスを検索すると、インデックスが無効になります.
  • インデックス列で関数を使用すると、インデックスが無効になります.
  • インデックス列で計算すると、インデックスの失効も
  • になります.
  • インデックス列not|!=|<>を使用しないでください.
  • なるべくorを使わないでunion
  • を使う
  • インデックス列でlikeを使用すると、インデックスの失効も
  • になります.
  • existsとinの使用選択
  • existsプライマリ・クエリーを先に実行します.プライマリ・クエリーがフィルタリングされている場合は、exists
  • を使用します.
  • inサブクエリを先に実行します.サブクエリのフィルタリングが多い場合はinを使用します.