mysql複習

MySQL理論系列html

  1. 列舉常見的關係型數據庫和非關係型都有那些?

關係型RDBMS:有表結構,存取數據前必先定義表結構,存數據必須按照字段的類型或者約束來mysql

典型表明:MySQLOracleDB2SQL server(銀行業經常使用)ios

 

非關係型(爬蟲類經常使用):存取數據都是採用key:value的形式redis

非關係型:Mongodbredismemcache(較不經常使用)sql

 

  1. MySQL常見數據庫引擎及比較?

常見innodbmyisammemoryblackhole幾種存儲引擎,數據庫

 

最經常使用的爲innodb innodb:亦爲默認存儲引擎,支持事務,行鎖設計,外鍵網絡

t1.frm (frame) t1.ibd (innodb data); 存入硬盤數據結構

 

myisamt2.MYD (myisam data) t2.MYI (myisam index) t2.frm (frame); 存入硬盤數據庫設計

 

blackhole: t3.frmide

 

memory: t4.frm; 存入內存,關閉服務端後,數據清空

 

  1. 簡述數據三大範式?

第一範式(1NF):確保每一列的原子性(若是每一列都是不可再分的最小數據單元,則知足第一範式。)

第二範式:非鍵字段必須依賴於鍵字段(第二範式要求每一個表只描述一件事。)

第三範式:在1NF基礎上,除了主鍵之外的其它列都不傳遞依賴於主鍵列,或者說: 任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

 

  1. 什麼是事務?MySQL如何支持事務?

什麼是事務開啓一個事務能夠包含一些sql語句,這些sql語句要麼同時成功;要麼一個都別想成功,稱之爲事務的原子性

 

事務的做用:轉帳等,屏蔽因網絡傳輸部分失效而帶來的影響

 

BEGIN START TRANSACTION:顯式地開啓一個事務

COMMIT:也可使用COMMIT WORK,不過兩者是等價的。COMMIT會提交事務,並使已對數據庫進行的全部修改爲爲永久性的

ROLLBACK:也可使用ROLLBACK WORK,不過兩者是等價的。回滾會結束用戶的事務,並撤銷正在進行的全部未提交的修改

SAVEPOINT identifierSAVEPOINT容許在事務中建立一個保存點,一個事務中能夠有多個SAVEPOINT

RELEASE SAVEPOINT identifier:刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常

ROLLBACK TO identifier:把事務回滾到標記點

SET TRANSACTION:用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

 

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 ;

 

  1. 簡述數據庫設計中一對多和多對多的應用場景?

a      左表與右表之間是否有多對一的關係 (多個員工屬於一個部門)

b      右表與左表之間是否有多對一的關係 (多個部門擁有一個員工)

 

ia True & b False  多對一

iia False & b True  多對一

iiia True & b True  多對多

iva False & b False  一對一

 

  1. 如何基於數據庫實現商城商品計數器?

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(彙集索引):葉子節點存放的一整條數據,

 

uniqueindex key(輔助索引):葉子節點存放的是:{名字:名字所在那條記錄的主鍵的值};覆蓋索引,回表操做

 

09. 索引在什麼狀況下遵循最左前綴的規則?

mysql中對a or b or c。。的形式,會從左至右依次查詢

 

10. 主鍵和外鍵的區別?

primary key就等同於not null unique(約束);加速查詢;innodb 用主鍵(一種索引)字段爲依據組織數據,造成一種樹型結構,從而加速查詢

 

key(索引)爲mysql中一種特殊的數據結構

aunique 約束條件,加速查詢

bprimary key 約束條件,加速查詢,innodb組織數據結構的依據

cindex key 加速查詢

dforeign 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)對於多列索引,不是使用的第一部分(第一個),則不會使用索引

3like查詢是以%開頭

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. 數據庫優化方案?

https://mp.weixin.qq.com/s?__biz=MzIxMjg4NDU1NA==&mid=2247483684&idx=1&sn=f5abc60e696b2063e43cd9ccb40df101&chksm=97be0c01a0c98517029ff9aa280b398ab5c81fa1fcfe0e746222a3bfe75396d9eea1e249af38&mpshare=1&scene=1&srcid=0606XGHeBS4RBZloVv786wBY#rd

 

16. charvarchar的區別?

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越高,優先級越高,越容易執行。

 

selecttypesimpleprimarysubqueryderived(衍生)unionunionresult

 

simple表示查詢中不包含子查詢或者union

 

當查詢中包含任何複雜的子部分,最外層的查詢被標記成primary

 

selectwhere列表中包含了子查詢,則子查詢被標記成subquery

 

from的列表中包含的子查詢被標記成derived

 

若第二個select出如今union後,則被標記成union,若unionfrom子句的子查詢中,外層的select被標記成derived

 

union表獲取結果的select被標記成union result

 

type叫訪問類型,表示在表中找到所需行的方式,常見類型有

 

allindexrangerefeq_refconstsystemNULL 性能從左至右由差至好。

 

ALL,即full table scanmysql將遍歷全表來找到所須要的行。

 

indexfull index scan,只遍歷索引樹。

 

range表示索引範圍掃描 ,對索引的掃描開始於一點,返回匹配的值域的行,常見於between<>的查詢。

 

ref爲非惟一性索引掃描,返回匹配某個單獨值的全部行,常見於非惟一索引即惟一索引的非惟一前綴進行的查找。

 

constsystem表示當對查詢部分進行優化,並轉化成一個常量時,使用這些類型訪問。好比將主鍵置於where列表中,mysql就能把該查詢置成一個常量。systemconst的一個特例,當查詢表中只有一行的狀況下使用的是system

 

NULL表示在執行語句中,不用查表或索引。

 

possiblekey表示能使用哪一個索引在表中找到行,查詢涉及到的字段上若存在索引,則該索引被列出,但不必定被查詢使用。

 

18. 在對name作了惟一索引前提下,簡述如下區別:

       select * from tb where name = ‘Oldboy’ 

       select * from tb where name = ‘Oldboy’ limit 1

limit 1顯示一條

相關文章
相關標籤/搜索