MySQL理論系列html
- 列舉常見的關係型數據庫和非關係型都有那些?
關係型RDBMS:有表結構,存取數據前必先定義表結構,存數據必須按照字段的類型或者約束來mysql
典型表明:MySQL,Oracle,DB2,SQL server(銀行業經常使用)ios
非關係型(爬蟲類經常使用):存取數據都是採用key:value的形式redis
非關係型:Mongodb,redis,memcache(較不經常使用)sql
- MySQL常見數據庫引擎及比較?
常見innodb,myisam,memory,blackhole幾種存儲引擎,數據庫
最經常使用的爲innodb innodb:亦爲默認存儲引擎,支持事務,行鎖設計,外鍵網絡
t1.frm (frame) t1.ibd (innodb data); 存入硬盤數據結構
myisam:t2.MYD (myisam data) t2.MYI (myisam index) t2.frm (frame); 存入硬盤數據庫設計
blackhole: t3.frmide
memory: t4.frm; 存入內存,關閉服務端後,數據清空
- 簡述數據三大範式?
第一範式(1NF):確保每一列的原子性(若是每一列都是不可再分的最小數據單元,則知足第一範式。)
第二範式:非鍵字段必須依賴於鍵字段(第二範式要求每一個表只描述一件事。)
第三範式:在1NF基礎上,除了主鍵之外的其它列都不傳遞依賴於主鍵列,或者說: 任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)
- 什麼是事務?MySQL如何支持事務?
什麼是事務: 開啓一個事務能夠包含一些sql語句,這些sql語句要麼同時成功;要麼一個都別想成功,稱之爲事務的原子性
事務的做用:轉帳等,屏蔽因網絡傳輸部分失效而帶來的影響
BEGIN 或START TRANSACTION:顯式地開啓一個事務
COMMIT:也可使用COMMIT WORK,不過兩者是等價的。COMMIT會提交事務,並使已對數據庫進行的全部修改爲爲永久性的
ROLLBACK:也可使用ROLLBACK WORK,不過兩者是等價的。回滾會結束用戶的事務,並撤銷正在進行的全部未提交的修改
SAVEPOINT identifier:SAVEPOINT容許在事務中建立一個保存點,一個事務中能夠有多個SAVEPOINT
RELEASE SAVEPOINT identifier:刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常
ROLLBACK TO identifier:把事務回滾到標記點
SET TRANSACTION:用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE
delimiter //
create PROCEDURE p5(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception #若是出現錯誤,執行
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;
DECLARE exit handler for sqlwarning #若是出現警告,執行
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;
START TRANSACTION; #事務的應用
update user set balance=900 where id =1;
update user123 set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT;
-- SUCCESS
set p_return_code = 0; #0表明執行成功
END //
delimiter ;
- 簡述數據庫設計中一對多和多對多的應用場景?
a、 左表與右表之間是否有多對一的關係 (多個員工屬於一個部門)
b、 右表與左表之間是否有多對一的關係 (多個部門擁有一個員工)
i、a True & b False 多對一
ii、a False & b True 多對一
iii、a True & b True 多對多
iv、a False & b False 一對一
- 如何基於數據庫實現商城商品計數器?
DROP TABLE access_counter;
CREATE TABLE access_counter(
solt INT NOT NULL PRIMARY KEY,
cnt INT NOT NULL
);
DELIMITER $
DROP PROCEDURE IF EXISTS `proc1`$
CREATE PROCEDURE `proc1`()
BEGIN
DECLARE i INT;
SET i=0;
WHILE i<100 DO
INSERT INTO access_counter VALUES(i,0);
SET i=i+1;
END WHILE;
END$
DELIMITER ;
CALL proc1();
SELECT * FROM access_counter;
07. 簡述觸發器、函數、視圖、存儲過程?
視圖、觸發器、事務、存儲過程、函數、流程控制皆是在庫下面創建
觸發器:在知足對某張表數據的增、刪、改的狀況下,自動觸發的功能稱之爲觸發器
爲什麼要用觸發器: 觸發器專門針對咱們對某一張表數據增insert、刪delete、改update的行爲,這類行爲一旦執行就會觸發觸發器的執行,即自動運行另一段sql代碼
函數:mysql內置的函數只能在sql語句中使用,mysql> select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
什麼是視圖:經過查詢獲得一張虛擬表,保存下來,下次可直接使用
爲何要用視圖: 若是要頻繁使用一張虛擬表,能夠不用重複查詢
如何用視圖:create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id;
刪除視圖:drop view teacher2course;
強調:在硬盤中,視圖只有表結構文件(.frm),沒有表數據文件(.idb); 其在後臺對應的是一條sql語句;視圖一般是用於查詢,儘可能不要修改視圖中的數據
#在mysql中函數是不能單獨使用的,必須放在sql語句中使用;但存儲過程是能夠單獨使用的
存儲過程:存儲過程包含了一系列可執行的sql語句,存儲過程存放於MySQL中,經過調用它的名字能夠執行其內部的一堆sql
08. MySQL索引種類
primary key(彙集索引):葉子節點存放的一整條數據,
unique,index key(輔助索引):葉子節點存放的是:{名字:名字所在那條記錄的主鍵的值};覆蓋索引,回表操做
09. 索引在什麼狀況下遵循最左前綴的規則?
mysql中對a or b or c。。的形式,會從左至右依次查詢
10. 主鍵和外鍵的區別?
primary key就等同於not null unique(約束);加速查詢;innodb 用主鍵(一種索引)字段爲依據組織數據,造成一種樹型結構,從而加速查詢
key(索引)爲mysql中一種特殊的數據結構
a、unique 約束條件,加速查詢
b、primary key 約束條件,加速查詢,innodb組織數據結構的依據
c、index key 加速查詢
d、foreign key 沒有加速查詢功能
11. MySQL常見的函數?
聚合函數group function(通常與分組連用)
select post,max(salary) from emp group by post; #取不出組內的元素name, age..,只能取組名(分組依據)或用聚合函數
select post,min(salary) from emp group by post;
select post,avg(salary) from emp group by post;
select post,sum(salary) from emp group by post;
select post,count(id) from emp group by post;
#group_concat(分組以後用):把想要用的信息取出;字符串拼接操做
select post,group_concat(name) from emp group by post;
select post,group_concat(name,"_SB") from emp group by post;
select post,group_concat(name,": ",salary) from emp group by post;
select post,group_concat(salary) from emp group by post;
補充concat(不分組時用):字符串拼接操做
select concat("NAME: ",name) as 姓名,concat("SAL: ",salary) as 薪資from emp;
12. 列舉 建立索引可是沒法命中索引的8種狀況。
1)若是條件中有or,即便其中有條件帶索引也不會使用(這也是爲何儘可能少用or的緣由)
2)對於多列索引,不是使用的第一部分(第一個),則不會使用索引
3)like查詢是以%開頭
4) 若是列類型是字符串,那必定要在條件中將數據使用引號引用起來,不然不使用索引
5) 若是mysql估計使用全表掃描要比使用索引快,則不使用索引
6) 沒有查詢條件,或者查詢條件沒有創建索引
7) 在查詢條件上沒有使用引導列
8) 查詢的數量是大表的大部分,應該是30%以上。
9) 索引自己失效
10) 查詢條件使用函數在索引列上,或者對索引列進行運算,運算包括(+,-,*,/,! 等) 錯誤的例子:select * from test where id-1=9; 正確的例子:select * from test where id=10;
11) 對小表查詢
12) 提示不使用索引
13) 統計數據不真實
14) CBO計算走索引花費過大的狀況。其實也包含了上面的狀況,這裏指的是表佔有的block要比索引小。
15) 隱式轉換致使索引失效.這一點應當引發重視.也是開發中常常會犯的錯誤. 因爲表的字段tu_mdn定義爲varchar2(20),但在查詢時把該字段做爲number類型以where條件傳給Oracle,這樣會致使索引失效. 錯誤的例子:select * from test where tu_mdn=13333333333; 正確的例子:select * from test where tu_mdn='13333333333';
16) 1,<> 2,單獨的>,<,(有時會用到,有時不會)
17) like "%_" 百分號在前.
18) 表沒分析.
19) 單獨引用複合索引裏非第一位置的索引列.
20) 字符型字段爲數字時在where條件裏不添加引號.
21) 對索引列進行運算.須要創建函數索引.
22) not in ,not exist.
23) 當變量採用的是times變量,而表的字段採用的是date變量時.或相反狀況。
24) B-tree索引is null不會走,is not null會走,位圖索引is null,is not null 都會走
25) 聯合索引is not null 只要在創建的索引列(不分前後)都會走, in null時 必需要和創建索引第一列一塊兒使用,當創建索引第一位置條件是is null 時,其餘創建索引的列能夠是is null(但必須在全部列 都知足is null的時候),或者=一個值; 當創建索引的第一位置是=一個值時,其餘索引列能夠是任何狀況(包括is null =一個值),以上兩種狀況索引都會走。其餘狀況不會走。
13. 如何開啓慢日誌查詢?
開啓慢查詢日誌,可讓MySQL記錄下查詢超過指定時間的語句,經過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。
在/etc/my.cnf中修改
14. 數據庫導入導出命令(結構+數據)?
http://www.cnblogs.com/zcw-ios/articles/3319480.html
15. 數據庫優化方案?
16. char和varchar的區別?
char: 定長
varchar: 變長
#不推薦混用,若是混用需定長在前、變長在後。
create table t12(x char(4)); # 超出4個字符則報錯,不夠4個字符則用空格補全成4個字符
create table t13(y varchar(4)); #超出4個字符則報錯不夠4個字符那麼字符有幾個就存幾個
name char(5)
# 缺點:浪費空間
# 優勢:存取速度都快
egon alex lxx wxx yx
name varchar(5)
# 缺點:存取速度都慢
# 優勢:節省空間(it depends); 須要一個頭(1-2個字節)存長度# 2bytes可存65535個字符,mysql中全部字符串(char)中字符數皆不超過65535
(1bytes+egon)(1bytes+alex)(1bytes+lxx)
17. 簡述MySQL的執行計劃?
id是一組數字,表示查詢中執行select子句或操做表的順序。
若是id相同,則執行順序從上至下。
若是是子查詢,id的序號會遞增,id越大則優先級越高,越先會被執行。
id若是相同,則能夠認爲是一組,從上往下順序執行,全部組中,id越高,優先級越高,越容易執行。
selecttype有simple,primary,subquery,derived(衍生),union,unionresult。
simple表示查詢中不包含子查詢或者union。
當查詢中包含任何複雜的子部分,最外層的查詢被標記成primary。
在select或where列表中包含了子查詢,則子查詢被標記成subquery。
在from的列表中包含的子查詢被標記成derived。
若第二個select出如今union後,則被標記成union,若union在from子句的子查詢中,外層的select被標記成derived。
從union表獲取結果的select被標記成union result。
type叫訪問類型,表示在表中找到所需行的方式,常見類型有
all,index,range,ref,eq_ref,const,system,NULL 性能從左至右由差至好。
ALL,即full table scan,mysql將遍歷全表來找到所須要的行。
index爲full index scan,只遍歷索引樹。
range表示索引範圍掃描 ,對索引的掃描開始於一點,返回匹配的值域的行,常見於between,<,>的查詢。
ref爲非惟一性索引掃描,返回匹配某個單獨值的全部行,常見於非惟一索引即惟一索引的非惟一前綴進行的查找。
const,system表示當對查詢部分進行優化,並轉化成一個常量時,使用這些類型訪問。好比將主鍵置於where列表中,mysql就能把該查詢置成一個常量。system是const的一個特例,當查詢表中只有一行的狀況下使用的是system。
NULL表示在執行語句中,不用查表或索引。
possiblekey表示能使用哪一個索引在表中找到行,查詢涉及到的字段上若存在索引,則該索引被列出,但不必定被查詢使用。
18. 在對name作了惟一索引前提下,簡述如下區別:
select * from tb where name = ‘Oldboy’
select * from tb where name = ‘Oldboy’ limit 1
limit 1顯示一條