千道Java面試真題整理系列:MySQL靈魂五十問,在遇面試也不怕!

一、MySQL 中有哪幾種鎖?

  1. 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低。
  2. 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高。
  3. 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度通常。

二、MySQL 中有哪些不一樣的表格?

共有 5 種類型的表格:sql

  • MyISAM
  • Heap
  • Merge
  • INNODB
  • ISAM

三、簡述在 MySQL 數據庫中 MyISAM 和 InnoDB 的區別

MyISAM: 不支持事務,可是每次查詢都是原子的; 支持表級鎖,即每次操做是對整個表加鎖; 存儲表的總行數; 一個 MYISAM 表有三個文件:索引文件、表結構文件、數據文件; 採用菲彙集索引,索引文件的數據域存儲指向數據文件的指針。輔索引與主索引 基本一致,可是輔索引不用保證惟一性。數據庫

InnoDb: 支持 ACID 的事務,支持事務的四種隔離級別; 支持行級鎖及外鍵約束:所以能夠支持寫併發;數組

不存儲總行數: 一個 InnoDb 引擎存儲在一個文件空間(共享表空間,表大小不受操做系統控制, 一個表可能分佈在多個文件裏),也有可能爲多個(設置爲獨立表空,表大小受操做系統文件大小限制,通常爲 2G),受操做系統文件大小的限制;緩存

主鍵索引採用彙集索引(索引的數據域存儲數據文件自己),輔索引的數據域存儲主鍵的值;所以從輔索引查找數據,須要先經過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入數據時,爲維持 B+樹結構,文件的大調安全

四、MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?

SQL 標準定義的四個隔離級別爲:bash

  1. read uncommited :讀到未提交數據
  2. read committed:髒讀,不可重複讀
  3. repeatable read:可重讀
  4. serializable :串行事物

五、CHAR 和 VARCHAR 的區別?

  • CHAR 和 VARCHAR 類型在存儲和檢索方面有所不一樣
  • CHAR 列長度固定爲建立表時聲明的長度,長度值範圍是 1 到 255 當 CHAR 值被存儲時,它們被用空格填充到特定長度,檢索 CHAR 值時需刪除尾隨空格。

六、主鍵和候選鍵有什麼區別?

表格的每一行都由主鍵惟一標識,一個表只有一個主鍵。服務器

主鍵也是候選鍵。按照慣例,候選鍵能夠被指定爲主鍵,而且能夠用於任何外鍵引用。併發

七、myisamchk 是用來作什麼的?

它用來壓縮 MyISAM 表,這減小了磁盤或內存使用。運維

MyISAM Static 和 MyISAM Dynamic 有什麼區別? 在 MyISAM Static 上的全部字段有固定寬度。動態 MyISAM 表將具備像 TEXT,BLOB 等字段,以適應不一樣長度的數據類型。MyISAM Static 在受損狀況下更容易恢復。memcached

八、若是一個表有一列定義爲 TIMESTAMP,將發生什麼?

每當行被更改時,時間戳字段將獲取當前時間戳。

列設置爲 AUTO INCREMENT 時,若是在表中達到最大值,會發生什麼狀況? 它會中止遞增,任何進一步的插入都將產生錯誤,由於密鑰已被使用。

怎樣才能找出最後一次插入時分配了哪一個自動增量? LAST_INSERT_ID 將返回由 Auto_increment 分配的最後一個值,而且不須要指定表名稱

九、你怎麼看到爲表格定義的全部索引?

索引是經過如下方式爲表格定義的:

SHOW INDEX FROM <tablename>;
複製代碼

十、LIKE 聲明中的%和_是什麼意思?

%對應於 0 個或更多字符,_只是 LIKE 語句中的一個字符。

如何在 Unix 和 MySQL 時間戳之間進行轉換?

  • UNIX_TIMESTAMP 是從 MySQL 時間戳轉換爲 Unix 時間戳的命令
  • FROM_UNIXTIME 是從 Unix 時間戳轉換爲 MySQL 時間戳的命令

十一、列對比運算符是什麼?

在 SELECT 語句的列比較中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR 或 LIKE 運算符。

十二、BLOB 和 TEXT 有什麼區別?

BLOB 是一個二進制對象,能夠容納可變數量的數據。TEXT 是一個不區分大小寫的 BLOB。

BLOB 和 TEXT 類型之間的惟一區別在於對 BLOB 值進行排序和比較時區分大小寫,對 TEXT 值不區分大小寫。

1三、MySQL_fetch_array 和 MySQL_fetch_object 的區別是什麼?

如下是 MySQL_fetch_array 和 MySQL_fetch_object 的區別:

  • MySQL_fetch_array() – 將結果行做爲關聯數組或來自數據庫的常規數組返回。
  • MySQL_fetch_object – 從數據庫返回結果行做爲對象。

1四、MyISAM 表格將在哪裏存儲,而且還提供其存儲格式?

每一個 MyISAM 表格以三種格式存儲在磁盤上:

  • ·「.frm」文件存儲表定義
  • ·數據文件具備「.MYD」(MYData)擴展名
  • 索引文件具備「.MYI」(MYIndex)擴展名

1五、MySQL 如何優化 DISTINCT?

DISTINCT 在全部列上轉換爲 GROUP BY,並與 ORDER BY 子句結合使用。

SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
複製代碼

1六、如何顯示前 50 行?

在 MySQL 中,使用如下代碼查詢顯示前 50 行:

SELECT*FROMLIMIT 0,50;
複製代碼

1七、可使用多少列建立索引?

任何標準表最多能夠建立 16 個索引列。

1八、NOW()和 CURRENT_DATE()有什麼區別?

  • NOW()命令用於顯示當前年份,月份,日期,小時,分鐘和秒。
  • CURRENT_DATE()僅顯示當前年份,月份和日期。

1九、什麼是非標準字符串類型?

  1. TINYTEXT
  2. TEXT
  3. MEDIUMTEXT
  4. LONGTEXT

20、什麼是通用 SQL 函數?

  1. CONCAT(A, B) – 鏈接兩個字符串值以建立單個字符串輸出。一般用於將兩個或多個字段合併爲一個字段。
  2. FORMAT(X, D)- 格式化數字 X 到 D 有效數字。
  3. CURRDATE(), CURRTIME()- 返回當前日期或時間。
  4. NOW() – 將當前日期和時間做爲一個值返回。
  5. MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 從日期值中提取給定數據。
  6. HOUR(),MINUTE(),SECOND() – 從時間值中提取給定數據。
  7. DATEDIFF(A,B) – 肯定兩個日期之間的差別,一般用於計算年齡
  8. SUBTIMES(A,B) – 肯定兩次之間的差別。
  9. FROMDAYS(INT) – 將整數天數轉換爲日期值。

2一、MySQL 支持事務嗎?

在缺省模式下,MySQL 是 autocommit 模式的,全部的數據庫更新操做都會即時提交,因此在缺省狀況下,MySQL 是不支持事務的。 可是若是你的 MySQL 表類型是使用 InnoDB Tables 或 BDB tables 的話,你的MySQL 就可使用事務處理,使用 SET AUTOCOMMIT=0 就可使 MySQL 容許在非 autocommit 模式,在非autocommit 模式下,你必須使用 COMMIT 來提交你的更改,或者用 ROLLBACK來回滾你的更改。

2二、MySQL 裏記錄貨幣用什麼字段類型好

NUMERIC 和 DECIMAL 類型被 MySQL 實現爲一樣的類型,這在 SQL92 標準容許。他們被用於保存值,該值的準確精度是極其重要的值,例如與金錢有關的數據。當聲明一個類是這些類型之一時,精度和規模的能被(而且一般是)指定。 例如:

salary DECIMAL(9,2)
複製代碼

在這個例子中,9(precision)表明將被用於存儲值的總的小數位數,而 2(scale)表明將被用於存儲小數點後的位數。 所以,在這種狀況下,能被存儲在 salary 列中的值的範圍是從-9999999.99 到9999999.99。

2三、MySQL 有關權限的表都有哪幾個?

MySQL 服務器經過權限表來控制用戶對數據庫的訪問,權限表存放在 MySQL 數據庫裏,由 MySQL_install_db 腳本初始化。這些權限表分別 user,db,table_priv,columns_priv 和 host。

2四、列的字符串類型能夠是什麼?

字符串類型是:

  1. SET
  2. BLOB
  3. ENUM
  4. CHAR
  5. TEXT

2五、MySQL 數據庫做發佈系統的存儲,一天五萬條以上的增量,預計運維三年,怎麼優化?

  1. 設計良好的數據庫結構,容許部分數據冗餘,儘可能避免 join 查詢,提升效率。
  2. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。
  3. MySQL 庫主從讀寫分離。
  4. 找規律分表,減小單表中的數據量提升查詢速度。
  5. 添加緩存機制,好比 memcached,apc 等。
  6. 不常常改動的頁面,生成靜態頁面。
  7. 書寫高效率的 SQL。好比 SELECT * FROM TABEL 改成 SELECT field_1,field_2, field_3 FROM TABLE.

2六、鎖的優化策略

  1. 讀寫分離
  2. 分段加鎖
  3. 減小鎖持有的時間
  4. 多個線程儘可能以相同的順序去獲取資源

不能將鎖的粒度過於細化,否則可能會出現線程的加鎖和釋放次數過多,反而效率不如一次加一把大鎖。

2七、索引的底層實現原理和優化

B+樹,通過優化的 B+樹 主要是在全部的葉子結點中增長了指向下一個葉子節點的指針,所以 InnoDB 建議爲大部分表使用默認自增的主鍵做爲主索引。

2八、什麼狀況下設置了索引但沒法使用

  1. 以「%」開頭的 LIKE 語句,模糊匹配
  2. OR 語句先後沒有同時使用索引
  3. 數據類型出現隱式轉化(如 varchar 不加單引號的話可能會自動轉換爲 int 型)

2九、實踐中如何優化 MySQL

最好是按照如下順序優化:

  1. SQL 語句及索引的優化
  2. 數據庫表結構的優化
  3. 系統配置的優化
  4. 硬件的優化

30、優化數據庫的方法

  1. 選取最適用的字段屬性,儘量減小定義字段寬度,儘可能把字段設置 NOTNULL,例如’省份’、’性別’最好適用 ENUM
  2. 使用鏈接(JOIN)來代替子查詢
  3. 適用聯合(UNION)來代替手動建立的臨時表
  4. 事務處理
  5. 鎖定表、優化事務處理
  6. 適用外鍵,優化鎖定表
  7. 創建索引
  8. 優化查詢語句

3一、簡單描述 MySQL 中,索引,主鍵,惟一索引,聯合索引的區別,對數據庫的性能有什麼影響(從讀寫兩方面)

索引是一種特殊的文件(InnoDB 數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏全部記錄的引用指針。

普通索引(由關鍵字 KEY 或 INDEX 定義的索引)的惟一任務是加快對數據的訪問速度。

普通索引容許被索引的數據列包含重複的值。若是能肯定某個數據列將只包含彼此各不相同的值,在爲這個數據列建立索引的時候就應該用關鍵字 UNIQUE 把它定義爲一個惟一索引。也就是說,惟一索引能夠保證數據記錄的惟一性。

主鍵,是一種特殊的惟一索引,在一張表中只能定義一個主鍵索引,主鍵用於惟一標識一條記錄,使用關鍵字 PRIMARY KEY 來建立。

索引能夠覆蓋多個數據列,如像 INDEX(columnA, columnB)索引,這就是聯合索引。

索引能夠極大的提升數據的查詢速度,可是會下降插入、刪除、更新表的速度,由於在執行這些寫操做時,還要操做索引文件。

3二、數據庫中的事務是什麼?

事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做完成,事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。

事務特性:

  1. 原子性:即不可分割性,事務要麼所有被執行,要麼就所有不被執行。
  2. 一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另外一種正確狀態
  3. 隔離性。在事務正確提交以前,不容許把該事務對數據的任何改變提供給任何其餘事務,
  4. 持久性。事務正確提交後,其結果將永久保存在數據庫中,即便在事務提交後有了其餘故障,事務的處理結果也會獲得保存。

或者這樣理解:

事務就是被綁定在一塊兒做爲一個邏輯工做單元的 SQL 語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過 ACID 測試,即原子性,一致性,隔離性和持久性。

3三、SQL 注入漏洞產生的緣由?如何防止?

SQL 注入產生的緣由:程序開發過程當中不注意規範書寫 sql 語句和對特殊字符進行過濾,致使客戶端能夠經過全局變量 POST 和 GET 提交一些 sql 語句正常執行。

防止 SQL 注入的方式:

開啓配置文件中的 magic_quotes_gpc 和 magic_quotes_runtime 設置執行 sql 語句時使用 addslashes 進行 sql 語句轉換Sql 語句書寫儘可能不要省略雙引號和單引號。 過濾掉 sql 語句中的一些關鍵詞:update、insert、delete、select、 * 。提升數據庫表和字段的命名技巧,對一些重要的字段根據程序的特色命名,取不易被猜到的。

3四、爲表中得字段選擇合適得數據類型

字段類型優先級: 整形>date,time>enum,char>varchar>blob,text優先考慮數字類型,其次是日期或者二進制類型,最後是字符串類型,同級別得數據類型,應該優先選擇佔用空間小的數據類型

3五、存儲時期

Datatime:以 YYYY-MM-DD HH:MM:SS 格式存儲時期時間,精確到秒,佔用 8 個字節得存儲空間,datatime 類型與時區無關 Timestamp:以時間戳格式存儲,佔用 4 個字節,範圍小 1970-1-1 到 2038-1-19,顯示依賴於所指定得時區,默認在第一個列行的數據修改時能夠自動得修改timestamp 列得值 Date:(生日)佔用得字節數比使用字符串.datatime.int 儲存要少,使用 date 只須要 3 個字節,存儲日期月份,還能夠利用日期時間函數進行日期間得計算 Time:存儲時間部分得數據 注意:不要使用字符串類型來存儲日期時間數據(一般比字符串佔用得儲存空間小,在進行查找過濾能夠利用日期得函數)使用 int 存儲日期時間不如使用 timestamp 類型

3六、對於關係型數據庫而言,索引是至關重要的概念,請回答有關索引的幾個問題:

一、索引的目的是什麼? 快速訪問數據表中的特定信息,提升檢索速度建立惟一性索引,保證數據庫表中每一行數據的惟一性。 加速表和表之間的鏈接使用分組和排序子句進行數據檢索時,能夠顯著減小查詢中分組和排序的時間

二、索引對數據庫系統的負面影響是什麼? 負面影響: 建立索引和維護索引須要耗費時間,這個時間隨着數據量的增長而增長;索引須要佔用物理空間,不光是表須要佔用數據空間,每一個索引也須要佔用物理空間;當對錶進行增、刪、改、的時候索引也要動態維護,這樣就下降了數據的維護速度。

三、爲數據表創建索引的原則有哪些? 在最頻繁使用的、用以縮小查詢範圍的字段上創建索引。在頻繁使用的、須要排序的字段上創建索引

四、什麼狀況下不宜創建索引?

對於查詢中不多涉及的列或者重複值比較多的列,不宜創建索引。對於一些特殊的數據類型,不宜創建索引,好比文本字段(text)等

3七、解釋 MySQL 外鏈接、內鏈接與自鏈接的區別

先說什麼是交叉鏈接: 交叉鏈接又叫笛卡爾積,它是指不使用任何條件,直接將一個表的全部記錄和另外一個表中的全部記錄一一匹配。

內鏈接 則是隻有條件的交叉鏈接,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出如今結果集中,即內鏈接只鏈接匹配的行。

外鏈接 其結果集中不只包含符合鏈接條件的行,並且還會包括左表、右表或兩個表中的全部數據行,這三種狀況依次稱之爲左外鏈接,右外鏈接,和全外鏈接。

左外鏈接,也稱左鏈接,左表爲主表,左表中的全部記錄都會出如今結果集中,對於那些在右表中並無匹配的記錄,仍然要顯示,右邊對應的那些字段值以NULL 來填充。

右外鏈接,也稱右鏈接,右表爲主表,右表中的全部記錄都會出如今結果集中。左鏈接和右鏈接能夠互換,MySQL 目前還不支持全外鏈接。

3八、Myql 中的事務回滾機制概述

事務是用戶定義的一個數據庫操做序列,這些操做要麼全作要麼全不作,是一個不可分割的工做單位,事務回滾是指將該事務已經完成的對數據庫的更新操做撤銷。 要同時修改數據庫中兩個不一樣表時,若是它們不是一個事務的話,當第一個表修改完,可能第二個表修改過程當中出現了異常而沒能修改,此時就只有第二個表依舊是未修改以前的狀態,而第一個表已經被修改完畢。而當你把它們設定爲一個事務的時候,當第一個表修改完,第二表修改出現異常而沒能修改,第一個表和第二個表都要回到未修改的狀態,這就是所謂的事務回滾

3九、SQL 語言包括哪幾部分?每部分都有哪些操做關鍵字?

SQL 語言包括數據定義(DDL)、數據操縱(DML),數據控制(DCL)和數據查詢(DQL)四個部分。

  • 數據定義:Create Table,Alter Table,Drop Table, Craete/Drop Index 等
  • 數據操縱:Select ,insert,update,delete,
  • 數據控制:grant,revoke
  • 數據查詢:select

40、完整性約束包括哪些?

數據完整性(Data Integrity)是指數據的精確(Accuracy)和可靠性(Reliability)。

分爲如下四類:

  1. 實體完整性:規定表的每一行在表中是唯一的實體。
  2. 域完整性:是指表中的列必須知足某種特定的數據類型約束,其中約束又包括取值範圍、精度等規定。
  3. 參照完整性:是指兩個表的主關鍵字和外關鍵字的數據應一致,保證了表之間的數據的一致性,防止了數據丟失或無心義的數據在數據庫中擴散。
  4. 用戶定義的完整性:不一樣的關係數據庫系統根據其應用環境的不一樣,每每還須要一些特殊的約束條件。用戶定義的完整性便是針對某個特定關係數據庫的約束條件,它反映某一具體應用必須知足的語義要求。 與表有關的約束:包括列約束(NOT NULL(非空約束))和表約束(PRIMARY KEY、foreign key、checkUNIQUE) 。

4一、什麼是鎖?

數據庫是一個多用戶使用的共享資源。當多個用戶併發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的狀況。若對併發操做不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。

加鎖是實現數據庫併發控制的一個很是重要的技術。當事務在對某個數據對象進行操做前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了必定的控制,在該事務釋放鎖以前,其餘的事務不能對此數據對象進行更新操做。 基本鎖類型:鎖包括行級鎖和表級鎖

4二、什麼叫視圖?遊標是什麼?

視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,視圖一般是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。 遊標:是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。

4三、什麼是存儲過程?用什麼來調用?

存儲過程是一個預編譯的 SQL 語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次 SQL,使用存儲過程比單純 SQL 語句執行要快。能夠用一個命令對象來調用存儲過程。

4四、如何通俗地理解三個範式?

  • 第一範式:1NF 是對屬性的原子性約束,要求屬性具備原子性,不可再分解;
  • 第二範式:2NF 是對記錄的唯一性約束,要求記錄有唯一標識,即實體的唯一性;
  • 第三範式:3NF 是對字段冗餘性的約束,即任何字段不能由其餘字段派生出來,它要求字段沒有冗餘。。

範式化設計優缺點: 優勢:能夠儘可能得減小數據冗餘,使得更新快,體積小 缺點:對於查詢須要多個表進行關聯,減小寫得效率增長讀得效率,更難進行索引優化

反範式化: 優勢:能夠減小表得關聯,能夠更好得進行索引優化 缺點:數據冗餘以及數據異常,數據得修改須要更多的成本

4五、什麼是基本表?什麼是視圖?

基本表是自己獨立存在的表,在 SQL 中一個關係就對應一個表。 視圖是從一個或幾個基本表導出的表。視圖自己不獨立存儲在數據庫中,是一個虛表

4六、試述視圖的優勢?

(1) 視圖可以簡化用戶的操做 (2) 視圖使用戶能以多種角度看待同一數據; (3) 視圖爲數據庫提供了必定程度的邏輯獨立性; (4) 視圖可以對機密數據提供安全保護。

4七、 NULL 是什麼意思

NULL 這個值表示 UNKNOWN(未知):它不表示「」(空字符串)。對 NULL 這個值的任何比較都會生產一個NULL 值。您不能把任何值與一個 NULL 值進行比較,並在邏輯上但願得到一個答案。 使用 IS NULL 來進行 NULL 判斷

4八、主鍵、外鍵和索引的區別?

定義:

  • 主鍵–惟一標識一條記錄,不能有重複的,不容許爲空
  • 外鍵–表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值
  • 索引–該字段沒有重複值,但能夠有一個空值

做用:

  • 主鍵–用來保證數據完整性
  • 外鍵–用來和其餘表創建聯繫用的
  • 索引–是提升查詢排序的速度

個數:

  • 主鍵–主鍵只能有一個
  • 外鍵–一個表能夠有多個外鍵
  • 索引–一個表能夠有多個惟一索引

4九、你能夠用什麼來確保表格裏的字段只接受特定範圍裏的值?

Check 限制,它在數據庫表格裏被定義,用來限制輸入該列的值。 觸發器也能夠被用來限制數據庫表格裏的字段可以接受的值,可是這種辦法要求觸發器在表格裏被定義,這可能會在某些狀況下影響到性能。

50、說說對 SQL 語句優化有哪些方法?(選擇幾條)

  1. Where 子句中:where 表之間的鏈接必須寫在其餘 Where 條件以前,那些能夠過濾掉最大數量記錄的條件必須寫在 Where 子句的末尾.HAVING 最後。
  2. 用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。 三、 避免在索引列上使用計算
  3. 避免在索引列上使用 IS NULL 和 IS NOT NULL
  4. 對查詢進行優化,應儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引。
  5. 應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描
  6. 應儘可能避免在 where 子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描
相關文章
相關標籤/搜索