Mysql校招、實習常見面試題總結1(較基礎)

1.如何避免 sql 注入?

PreparedStatement(簡單又有效的方法)、使用正則表達式過濾傳入的參數、字符串過濾、檢查是否包函非法字符、頁面判斷代碼。

2.數據庫的三範式是什麼?

第一範式:當關系模式R的所有屬性都不能在分解爲更基本的數據單位時,稱R是滿足第一範式的,簡記爲1NF。滿足第一範式是關係模式規範化的最低要
求,否則,將有很多基本操作在這樣的關係模式中實現不了。
第二範式:如果關係模式R滿足第一範式,並且R得所有非主屬性都完全依賴於R的每一個候選關鍵屬性,稱R滿足第二範式,簡記爲2NF。
第三範式:設R是一個滿足第一範式條件的關係模式,X是R的任意屬性集,如果X非傳遞依賴於R的任意一個候選關鍵字,稱R滿足第三範式,簡記爲3NF.

3.一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 MySQL 數據庫,又插入了一條數據,此時 ID 是幾?

一般情況下,我們創建的表的類型是InnoDB,如果新增一條記錄(不重啓mysql的情況下),這條記錄的id是18;但是如果重啓(文中提到的)MySQL的話,這條記錄的ID是15。因爲InnoDB表只把自增主鍵的最大ID記錄到內存中,所以重啓數據庫或者對錶OPTIMIZE操作,都會使最大ID丟失。 但是,如果我們使用表的類型是MylSAM,那麼這條記錄的ID就是18。因爲MylSAM表會把自增主鍵的最大ID記錄到數據文件裏面,重啓MYSQL後,自增主鍵的最大ID也不會丟失。因此題目所問的ID應該是8.

4.Char 和 VarChar 的區別是什麼?

(1)首先明確的是,char的長度是不可變的,而varchar的長度是可變的,
(2)定義一個char[10]和varchar[10],如果存進去的是‘abcd’,那麼char所佔的長度依然爲10,除了字符‘abcd’外,後面跟六個空格,而varchar就立馬把長度變爲4了,取數據的時候,char類型的要用trim()去掉多餘的空格,而varchar是不需要的,(3)char的存取數度還是要比varchar要快得多,因爲其長度固定,方便程序的存儲與查找;但是char也爲此付出的是空間的代價,因爲其長度固定,所以難免會有多餘的空格佔位符佔據空間,可謂是以空間換取時間效率,而varchar是以空間效率爲首位的。(4)char的存儲方式是,對英文字符(ASCII)佔用1個字節,對一個漢字佔用兩個字節;而varchar的存儲方式是,對每個英文字符佔用2個字節,漢字也佔用2個字節,兩者的存儲數據都非unicode的字符數據。

5.MySQL 的內連接、左連接、右連接有什麼區別?

1.內連接,顯示兩個表中有聯繫的所有數據;2.左鏈接,以左表爲參照,顯示所有數據;3.右鏈接,以右表爲參照顯示數據;

6.MySQL索引是怎麼實現的?

傳送門

7.怎麼驗證 MySQL的索引是否滿足需求?

使用方法,在select語句前加上explain就可以了:EXPLAIN SELECT surname,first_name form a,b WHERE a.id=b.id

8.說一下數據庫的事務隔離?

讀未提交,讀提交,可重複讀,可串行。

9.說一下 MySQL常用的引擎?

在MySQL數據庫中,常用的引擎主要就是2個:Innodb和MyIASM。
傳送門

10.說一下 MySQL的行鎖和表鎖?

傳送門

11.說一下樂觀鎖和悲觀鎖?

悲觀鎖:正如其名,它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度(悲觀),因此,在整個數據處理過程中,將數據處於鎖定狀態。 悲觀鎖的實現,往往依靠數據庫提供的鎖機制 (也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。

樂觀鎖( Optimistic Locking )是相對悲觀鎖而言,樂觀鎖假設數據一般情況下不會造成衝突,所以在事務對數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,如果發現衝突了,則返回錯誤信息,讓用戶決定如何去做。

相對於悲觀鎖,在對數據庫進行處理的時候,樂觀鎖並不會使用數據庫提供的鎖機制,一般用記錄數據版本的方式實現樂觀鎖。
傳送門

12.MySQL問題排查都有哪些手段?

事物級別select @@global.tx_isolation;輸出數據當前狀態–返回最近一次死鎖場景,等等信息SHOW ENGINE INNODB STATUS ;可用於排查死鎖問題,鎖定行數等問題 查詢數據庫連接信息 select * from information_schema.PROCESSLIST查詢事務信息–觀察事務啓動時間,判斷是否爲最近的創建的 select * from information_schema.INNODB_TRX;。查詢數據庫鎖等待信息–如果存在數據表示當前存在所等待情況 select * from information_schema.INNODB_LOCK_WAITS;手動殺掉某個進程–來源於select * from information_schema.INNODB_TRX; kill trx_mysql_thread_id; 數據庫客戶端連接ip統計;查詢數據庫指定連接的當前執行sql 。 查詢鎖等待的前後事物和客戶端調用的簡單sql 。 數據庫客戶端連接簡介

13.如何做 MySQL的性能優化?

(1)MySQL數據表字段要選取合適的字段屬性。
(2)使用連接Join來代替字查詢(sub-Query)。
(3)使用聯合Union來代替手動創建臨時表。
(4)使用事務機制來完成需要多個SQL操作的數據處理,保證數據的完整性和安全訪問。事務一begin關鍵字開始,commit關鍵字結束,rollback命令可以把數據庫恢復到begin開始之前的狀態。(5)使用外鍵來優化關聯表的性能,外鍵可以用來保證數據的關聯性。
(6)使用索引提高MySQL數據庫的性能。索引是提高數據庫性能的常用方法,它可以令數據庫服務器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含MAX(),MIN()和ORDER BY這些命令的時候,性能提高更爲明顯。
(7)通過優化查詢語句提高查詢速度。多數情況下索引可以提高查詢速度,單如果SQL語句使用不恰當的話,索引將無法發揮他應有的作用。1)最好在相同類型的字段間進行比較2)在建有索引的字段上儘量不要使用函數操作.
(8)如果情況允許鎖定表的方式會比採用事務的方式擁有更好的性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章