1. 程式人生 > >轉載 數據庫面試經歷

轉載 數據庫面試經歷

tails 獨立 表示 strong cache OS amp 可變長參數 sql註入

一、MySQL

1、mysql如何做分頁

mysql數據庫做分頁用limit關鍵字,它後面跟兩個參數startIndex和pageSize


2、mysql引擎有哪些,各自的特點是什麽?

http://www.cnblogs.com/ctztake/p/8453990.html


3、數據庫怎麽建立索引

create index account_index on `table name `(`字段名`(length)


4、一張表多個字段,怎麽創建組合索引

create index account_index on `table name `(`字段名`,‘字段名‘)


5、如何應對數據的高並發,大量的數據計算

1.創建索引
2.數據庫讀寫分離,兩個數據庫,一個作為寫,一個作為讀
3. 外鍵去掉


4.django中orm表性能相關的


select_related:

對於一對一字段(OneToOneField)和外鍵字段(ForeignKey),可以使用select_related 來對QuerySet進行優化。

技術分享圖片
select_related主要針一對一和多對一關系進行優化。
select_related使用SQL的JOIN語句進行優化,通過減少SQL查詢的次數來進行優化、提高性能。
可以通過可變長參數指定需要select_related的字段名。也可以通過使用雙下劃線“__”連接字段名來實現指定的遞歸查詢。
沒有指定的字段不會緩存,沒有指定的深度不會緩存,如果要訪問的話Django會再次進行SQL查詢。
也可以通過depth參數指定遞歸的深度,Django會自動緩存指定深度內所有的字段。如果要訪問指定深度外的字段,Django會再次進行SQL查詢。
也接受無參數的調用,Django會盡可能深的遞歸查詢所有的字段。但註意有Django遞歸的限制和性能的浪費。
Django >= 1.7,鏈式調用的select_related相當於使用可變長參數。Django < 1.7,鏈式調用會導致前邊的select_related失效,只保留最後一個。
技術分享圖片

prefetch_related:

對於多對多字段(ManyToManyField)和一對多字段,可以使用prefetch_related()來進行優化。

prefetch_related()和select_related()的設計目的很相似,都是為了減少SQL查詢的數量,但是實現的方式不一樣。後者是通過JOIN語句,在SQL查詢內解決問題。
但是對於多對多關系,使用SQL語句解決就顯得有些不太明智,因為JOIN得到的表將會很長,會導致SQL語句運行時間的增加和內存占用的增加。若有n個對象,每個對象的多對多字段對應Mi條
,就會生成Σ(n)Mi 行的結果表。 prefetch_related()的解決方法是,分別查詢每個表,然後用Python處理他們之間的關系。
因為select_related()總是在單次SQL查詢中解決問題,而prefetch_related()會對每個相關表進行SQL查詢,因此select_related()的效率通常比後者高。
鑒於第一條,盡可能的用select_related()解決問題。只有在select_related()不能解決問題的時候再去想prefetch_related()。
你可以在一個QuerySet中同時使用select_related()和prefetch_related(),從而減少SQL查詢的次數。
只有prefetch_related()之前的select_related()是有效的,之後的將會被無視掉

6、數據庫內連表、左連表、右連表

內連接是根據某個條件連接兩個表共有的數據
左連接是根據某個條件以及左邊的表連接數據,右邊的表沒有數據的話則為null
右連接是根據某個條件以及右邊的表連接數據,左邊的表沒有數據的話則為null

7、視圖和表的區別

視圖是已經編譯好的sql語句,是基於sql語句的結果集的可視化的表,而表不是
視圖是窗口,表示內容
視圖沒有實際的物理記錄,而表有

視圖是虛表,表是實表

視圖的建立和刪除只影響視圖本身,不影響對應的表

8、關系型數據庫的特點

數據集中控制
數據獨立性高
數據共享性好
數據冗余度小
數據結構化
統一的數據保護能力

9、mysql數據庫都有哪些索引

普通索引:普通索引僅有一個功能:加速查找
唯一索引:唯一索引兩個功能:加速查找和唯一約束(可含null)
外鍵索引:外鍵索引兩個功能:加速查找和唯一約束(不可為null)
聯合索引:聯合索引是將n個列組合成一個索引,應用場景:同時使用n列來進行查詢

觸發器

使用觸發器可以定制用戶對表進行【增、刪、改】操作時前後的行為,註意:沒有查詢

技術分享圖片 View Code 技術分享圖片 View Code

特別的:NEW表示即將插入的數據行,OLD表示即將刪除的數據行。

二 使用觸發器

觸發器無法由用戶直接調用,而知由於對表的【增/刪/改】操作被動引發的。

三 刪除觸發器

drop trigger tri_after_insert_cmd;

10、存儲過程

http://www.cnblogs.com/ctztake/p/7544559.html

存儲過程不允許執行return語句,但是可以通過out參數返回多個值,存儲過程一般是作為一個獨立的部分來執行,存儲過程是一個預編譯的SQL語句。

11、sql優化:

選取最適用的字段屬性

使用連接(JOIN)來代替子查詢(Sub-Queries)

select句中避免使用 ‘*‘

減少訪問數據庫的次數
刪除重復記錄
用where子句替代having子句
減少對表的查詢
explain

12、char和vachar區別:

char是固定長度,存儲需要空間12個字節,處理速度比vachar快,費內存空間,當存儲的值沒有達到指定的範圍時,會用空格替代
vachar是不固定長度,需要存儲空間13個字節,節約存儲空間,存儲的是真實的值,會在存儲的值前面加上1-2個字節,用來表示真實數據的大小

13、Mechached與redis

mechached:只支持字符串,不能持久化,數據僅存在內存中,宕機或重啟數據將全部失效
不能進行分布式擴展,文件無法異步法。
優點:mechached進程運行之後,會預申請一塊較大的內存空間,自己進行管理。
redis:支持服務器端的數據類型,redis與memcached相比來說,擁有更多的數據結構和並發支持更豐富的數據操作,可持久化。
五大類型數據:string、hash、list、set和有序集合,redis是單進程單線程的。
缺點:數據庫的容量受到物理內存的限制。

14、sql註入

sql註入是比較常見的攻擊方式之一,針對編程員編程的疏忽,通過sql語句,實現賬號無法登陸,甚至篡改數據庫。
防止:凡涉及到執行sql中有變量時,切記不要用拼接字符串的方法


16、遊標是什麽?

是對查詢出來的結果集作為一個單元來有效的處理,遊標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行,可以對結果集當前行做修改,
一般不使用遊標,但是需要逐條處理數據的時候,遊標顯得十分重要

17、 數據庫支持多有標準的SQL數據類型,重要分為三類

數值類型(tinyint,int,bigint,浮點數,bit)
字符串類型(char和vachar,enum,text,set)
日期類型(date,datetime,timestamp)

枚舉類型與集合類型

18、mysql慢查詢

慢查詢對於跟蹤有問題的查詢很有用,可以分析出當前程序裏哪些sql語句比較耗費資源
慢查詢定義:
指mysql記錄所有執行超過long_query_time參數設定的時間值的sql語句,慢查詢日誌就是記錄這些sql的日誌。
mysql在windows系統中的配置文件一般是my.ini找到mysqld
log-slow-queries = F:\MySQL\log\mysqlslowquery.log 為慢查詢日誌存放的位置,一般要有可寫權限
long_query_time = 2 2表示查詢超過兩秒才記錄

19、memcached命中率

命中:可以直接通過緩存獲取到需要的數據
不命中:無法直接通過緩存獲取到想要的數據,需要再次查詢數據庫或者執行其他的操作,原因可能是由於緩存中根本不存在,或者緩存已經過期
緩存的命中率越高則表示使用緩存的收益越高,應額用的性能越好,抗病發能力越強
運行state命令可以查看memcached服務的狀態信息,其中cmd—get表示總的get次數,get—hits表示命中次數,命中率=get—hits / cmd—get

20、Oracle和MySQL該如何選擇,為什麽?

他們都有各自的優點和缺點。考慮到時間因素,我傾向於MySQL
選擇MySQL而不選Oracle的原因
MySQL開源
MySQL輕便快捷
MySQL對命令行和圖形界面的支持都很好
MySQL支持通過Query Browser進行管理

21、什麽情況下適合建立索引?

1.為經常出現在關鍵字order by、group by、distinct後面的字段,建立索引
2.在union等集合操作的結果集字段上,建立索引,其建立索引的目的同上
3.為經常用作查詢選擇的字段,建立索引
4.在經常用作表連接的屬性上,建立索引

22、數據庫底層是用什麽結構實現的,你大致畫一下

底層用B+數實現,結構圖參考:
http://blog.csdn.net/cjfeii/article/details/10858721
http://blog.csdn.net/tonyxf121/article/details/8393545

23、sql語句應該考慮哪些安全性?

1.防止sql註入,對特殊字符進行轉義,過濾或者使用預編譯的sql語句綁定變量
2.最小權限原則,特別是不要用root賬戶,為不同的類型的動作或者組建使用不同的賬戶
3.當sql運行出錯時,不要把數據庫返回的錯誤信息全部顯示給用戶,以防止泄漏服務器和數據庫相關信息

24、數據庫事物有哪幾種?

隔離性、持續性、一致性、原子性

25、MySQ數據表在什麽情況下容易損壞?

服務器突然斷電導致數據文件損壞
強制關機,沒有先關閉mysq服務器等

26、drop、delete與truncate的區別

當表被TRUNCATE 後,這個表和索引所占用的空間會恢復到初始大小,

DELETE操作不會減少表或索引所占用的空間。

drop語句將表所占用的空間全釋放掉。

技術分享圖片
一、delete

1、delete是DML,執行delete操作時,每次從表中刪除一行,並且同時將該行的的刪除操作記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,但要註意表空間要足夠大,
需要手動提交(commit)操作才能生效,可以通過rollback撤消操作。 2、delete可根據條件刪除表中滿足條件的數據,如果不指定where子句,那麽刪除表中所有記錄。 3、delete語句不影響表所占用的extent,高水線(high watermark)保持原位置不變。 二、truncate 1、truncate是DDL,會隱式提交,所以,不能回滾,不會觸發觸發器。 2、truncate會刪除表中所有記錄,並且將重新設置高水線和所有的索引,缺省情況下將空間釋放到minextents個extent,除非使用reuse storage,。不會記錄日誌,所以執行速度很快,
但不能通過rollback撤消操作(如果一不小心把一個表truncate掉,也是可以恢復的,只是不能通過rollback來恢復)。 3、對於外鍵(foreignkey )約束引用的表,不能使用 truncate table,而應使用不帶 where 子句的 delete 語句。 4、truncatetable不能用於參與了索引視圖的表。 三、drop 1、drop是DDL,會隱式提交,所以,不能回滾,不會觸發觸發器。 2、drop語句刪除表結構及所有數據,並將表所占用的空間全部釋放。 3、drop語句將刪除表的結構所依賴的約束,觸發器,索引,依賴於該表的存儲過程/函數將保留,但是變為invalid狀態。
技術分享圖片

27、數據庫範式

1.第一範式:就是無重復的列
2.第二範式:就是非主屬性非部分依賴於主關鍵字
3.第三範式:就是屬性不依賴於其他非主屬性(消除冗余)

28、MySQL鎖類型

根據鎖的類型分:可以分為共享鎖、排他鎖、意向共享鎖和意向排他鎖
根據鎖的粒度分:可以分為行鎖、表鎖
對於mysql而言,事務機制更多是靠底層的存儲引擎來實現的,因此,mysql層面只有表鎖,
而支持事物的innodb存儲引起則實現了行鎖(在行相應的索引記錄上的鎖)
說明:對於更新操作(讀不上鎖),只有走索引才可能上行鎖
MVCC(多版本並發控制)並發控制機制下,任何操作都不會阻塞讀取操作,
讀取操作也不會阻塞任何操作,只因為讀不上鎖
共享鎖:由讀表操作加上的鎖,加鎖後其他用戶只能獲取該表或行的共享鎖,不能獲取排他鎖,
也就是說只能讀不能寫
排他鎖:由寫表操作加上的鎖,加鎖後其他用戶不能獲取該表或該行的任何鎖,典型mysql事物中的更新操作
意向共享鎖(IS):事物打算給數據行加行共享鎖,事物在給一個數據行加共享鎖前必須先取得該表的IS鎖
意向排他鎖(IX):事物打算給數據行加行排他鎖,事物在給一個數據行家排他鎖前必須先取得該表的IX鎖

29、如何解決MYSQL數據庫中文亂碼問題?

1.在數據庫安裝的時候指定字符集
2.如果在按完了以後可以更改配置文件
3.建立數據庫時候:指定字符集類型
4.建表的時候也指定字符集

30、數據庫應用系統設計

1.規劃
2.需求分析
3.概念模型設計
4.邏輯設計
5.物理設計
6. 程序編制及調試
7.運行及維護
ps:數據庫常見面試問題總結

轉載 數據庫面試經歷