深刻淺出mysql數據庫開發(第二版)筆記

第一部分:【基礎篇】
2.2.1:SQL分類
1)DDL(Data Definition Languages): 數據定義語言
經常使用語句:create,drop,alter 等
2)DML(Data Manipulation Language):數據操做語句
經常使用語句:insert,delete,update和select等
3)DCL(Data Control Language):數據控制語句,定義數據庫,表,字段,用戶的訪問權限和安全級別
經常使用語句:grant,revoke

DDL:
tableName = emp
desc:查看錶結構語句
例: desc emp;

alter:
1)修改字段類型
alter table emp modify column ename varchar(20);
2)新增字段:默認加在最後,可使用alter,first 控制字段位置
alter table emp add column age int(2)after ename;
3)刪除表字段
aler table emp drop column age;
4)字段更名
alter table emp change age age int(10);
5)修改代表
alter table emp rename emp_new;
注意:change 和 modify 均可以修改表的定義,change能夠修改列名,modify則不能;建議記住change用法:

DML:
1.limit:結合order by 語句能夠實現分頁
select * from emp order by ename limit 2,3; 

2.錶鏈接:內鏈接和外鏈接
1)內鏈接:只是顯示兩張表匹配的內容;
select * from emp,dept where emp.deptId = dept.deptId
2)外鏈接:會把未匹配的內容也顯示出來
左鏈接:顯示全部左邊表的記錄,甚至是右邊表中沒有和它匹配
右鏈接:顯示全部右邊表的記錄,甚至是左邊表中沒有和它匹配
左:
select ename,deptname from emp left join dept on emp.deptId = dept.deptId; 
3)union,unionall 記錄聯合
select deptno from emp union select deptno from dept;

DCL:
用戶名:z1,密碼:123,數據庫:sakila

賦予用戶名在z1對數據庫sakila下全部表均可以進行select,insert
grant select,insert on sakila.* to 'z1'@'localhost' identified by '123'; 
撤銷用戶民z1對數據庫sakila下全部表的insert權限
revoke insert on sakila.* from 'z1'@'localhost';

幫助文檔查看:
?contents
"? 類型別名" 
例如查看數據庫支持的數據類型:"? data types"
"? create table" 查看數據庫建立語句
"? show" show命令均可以查看什麼東東

3.1數據類型

浮點數:float(M,D)(單精度) double(M,D)(雙精度)  
有精度偏差:float f = 7.22f;float c = 7.0f;f - c = 0.21999979;
定點數:decimal(M,D)  適合用來表示貨幣等精度高的數據
M:表明一共顯示M位數字;
D:表明小數位數,超太小數位會按照四捨五入保存

3.2日期時間類型
DATE:年月日
TIME:時分秒
DATETIME:年月日時分秒
TIMESRAMP:若是須要常常插入日期或者更新當前日期使用;缺點:表示範圍比較小(區分時區時間使用);
表中的第一個TIMESTAMP列自動設置爲系統時間,若是在一個TIMESTAMP列中插入NULL,則該列值將自動設置爲當前日期和時間

3.3.1CHAR 和 VARCHAR類型
CHAR:定長字符(會自動刪除字符串後面的空格)
VARCHAR:可變的字符,會根據實際字符長度進行調整;(保留原始字符,不作任何處理)

第二部分:【開發篇】
1.MySQL存儲引擎:MyISAM,InnoDB,BDB,MEMORY,MERGE,NDB Cluster,ARCHIVE,CSV ...
  提供事物安全表:InnoDB,BDB;其餘都爲非事物 
引擎優缺點:
1)MyISAM:
優勢:訪問速度快
缺點:不支持事物,也不支持外鍵
2)InnoDB:(mysql默認存儲引擎)
優勢:支持事物,支持外鍵
缺點:寫的效率低,而且會佔用更多的磁盤空間以保留數據和索引
3)MEMORY: 基於內存來建立表
優勢:讀寫速度快
缺點:不安全,數據量大小有限制(數據容易丟失)
4)MEGER: 存儲引擎是一組MyISAM表的組合,顧名思義就是對多個表進行整合

8.2 TEXT 與 BLOB(保存較大文本時須要使用)
1)TEXT:只能存儲字符,不能存儲二進制
2)BLOB:能夠存儲二進制;好比:照片,視頻
3)對大文本進行檢索時,可使用合成的(Synthetic)來提升文本的查詢性能;(即:對文本內容創建散列碼,並把該字段存儲到數據表中,查詢時經過散列碼查詢)
例:create table t(id varchar(100),context blob,hash_value varchar(40));
    insert into t(1,repeat('bj',2),md5(context));    
    hash_value字段即爲散列碼;
注意:在使用blob,text類型進行頻繁刪除操做時,須要及時進行碎片清理;optimize table tableName;

10.1索引的介紹
1.索引的分類:
1)btree
2)hash 
3)r-tree(空間索引),通常不多用到
4)fulltext(全文索引) 僅支持varchar, char,text類型
2.存儲引擎支持的索引:
1)MyISAM存儲引擎:btree(默認),fulltext,R-tree(空間索引)
2)innodb存儲引擎:btree(默認)
3)memory存儲引擎:hash(默認),btree
3.索引建立語句
  create index index_name on tablename (indexname);

10.2索引的設計原則
1)索引列要使用在條件查詢列中(where 後面的列),不該該使用在select 列中
2)索引惟一性,這樣能提升索引效率(索引基數越大,效果越好)
例如:記錄性別的列只有:M,F,對此列建立索引時無論搜索哪一個值,都會得出大約一半的列,索引用處不大(基數小)
3)索引簡短性,較小的值減小磁盤io,較短的值比較更快,索引高速緩衝區能容納更多的索引鍵值;
若是一個比較長的列要創建索引:要考慮是否能夠創建前綴索引(要保證大多數的惟一性),以達到簡短性
前綴索引:列類型爲 char(200),能夠取前10到20個字符做爲索引;
4)不要過渡使用索引,過渡使用會形成性能問題;由於更新數據的同時,也要對索引維護更新;
5)利用最左索引,最左前綴是用在複合索引上的;
例如:建立索引name_age,mysql會對name進行排序,name相等時進行age排序,即order by name,age原則;
語句1:select * from student where name = "wg" and age = 28;
語句2:select * from student where age = 28 and name = "wg";
最左索引說的就是條件查詢時先使用最左邊的索引字段,例如:語句1,可是語句1和語句2的查詢效果是同樣的,那是由於mysql優化器對sql進行了優化,語句2優化後就是語句1;

10.3 btree與hash索引比較
hash: 只能進行關鍵字查詢,即=或<=>;優化器不能使用hash索引來加速order by 操做;
btree:適合like,between,>= 或<= 操做時都能使用到索引

下列查詢適合btree和hash
select * from key_col = 1 or key_col in(2,5,6) ;
只適合btree
select * from key_col >= 1 and key_col <= 6 ;
select * from key_col2 like 'txt%';

14.1 lock tables 與 unlock tables
當一個表被一個線程lock 時,其餘線程能夠進行select 操做,插入,修改操做會等待,直到鎖表線程執行unlock tables;
當鎖表線程執行另外一個lock tables 或者關閉與服務器關閉鏈接時,會隱式解鎖鎖定的表
例子:
線程1:lock table emp read;
線程2:select * from emp; (能夠查詢)
線程2:insert into emp values('1111','2018-02-07',5000,2);(會等待)
線程2:update emp set ename = '2222' where ename = '2222';(會等待)
當線程1執行 unlock tables;或執行另外一個lock table 時(包含 lock table emp),或線程關閉鏈接時, 線程2:執行插入更新操做; 
例子:
線程1:lock table emp write;
線程2:select * from emp;(能夠查詢)
線程2:select * from emp where ename = '111';(會等待)

總結:讀鎖定會阻塞寫操做,同理寫操做會阻塞讀操做

14.2 事物控制
mysql事物默認是自動提交的,即set autocommit = 11)經過設置set autocommit = 0;能夠改變提交模式,以後全部的事物都須要明確的命令(commit)提交;
2)若是隻是某些語句須要手動提交,可使用 start transaction 開啓事物,執行sql操做...,commit;提交;
   start transactio 語句會開啓一個事物,會切換到手動提交模式;直到執行commit命令,會再次切換到自動提交模式;
3)commit and chain;提交以後會再次開啓一個事物;
4)rollback 結合savepoint使用;
      


 
相關文章
相關標籤/搜索