MySQL常見面試題與答案整理

一、MySQL 中有哪幾種鎖?

一、表級鎖: 開銷小, 加鎖快; 不會出現死鎖; 鎖定粒度大, 發生鎖衝突的機率最高, 併發度最低。java

二、行級鎖: 開銷大, 加鎖慢; 會出現死鎖; 鎖定粒度最小, 發生鎖衝突的機率最低, 併發度也最高。面試

三、頁面鎖: 開銷和加鎖時間界於表鎖和行鎖之間; 會出現死鎖; 鎖定粒度界於表鎖和行鎖之間, 併發度通常。sql

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

共有 5 種類型的表格: 一、MyISAM二、Heap 三、Merge 四、INNODB 五、MISAM數據庫

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

MyISAM:數組

不支持事務, 可是每次查詢都是原子的; 支持表級鎖, 即每次操做是對整個表加鎖; 存儲表的總行數;緩存

一個 MYISAM 表有三個文件: 索引文件、表結構文件、數據文件;服務器

採用菲彙集索引,   索引文件的數據域存儲指向數據文件的指針。輔索引與主索引基本一致, 可是輔索引不用保證惟一性。微信

InnoDb:併發

支持 ACID 的事務, 支持事務的四種隔離級別; 支持行級鎖及外鍵約束: 所以能夠支持寫併發; 不存儲總行數:運維

一個 InnoDb 引擎存儲在一個文件空間( 共享表空間, 表大小不受操做系統控制,

一個表可能分佈在多個文件裏), 也有可能爲多個( 設置爲獨立表空, 表大小受操做系統文件大小限制, 通常爲 2G), 受操做系統文件大小的限制;

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

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

級之間的區別?SQL 標準定義的四個隔離級別爲:

一、read uncommited : 讀到未提交數據

二、read committed: 髒讀, 不可重複讀

三、repeatable read: 可重讀

四、serializable : 串行事物

五、CHAR 和VARCHAR 的區別?

一、CHAR 和 VARCHAR 類型在存儲和檢索方面有所不一樣

二、CHAR 列長度固定爲建立表時聲明的長度, 長度值範圍是 1 到 255 當 CHAR 值被存儲時, 它們被用空格填充到特定長度, 檢索 CHAR 值時需刪除尾隨空格。

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

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

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

七、myisamchk 是用來作什麼的?

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

MyISAM Static 和 MyISAM Dynamic 有什麼區別?

在 MyISAM Static 上的全部字段有固定寬度。動態 MyISAM 表將具備像 TEXT, BLOB 等字段, 以適應不一樣長度的數據類型。

MyISAM Static 在受損狀況下更容易恢復。

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

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

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

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

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

SHOW INDEX FROM ;

十、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*FROM TABLE LIMIT 0,50;

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

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

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

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

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

一、TINYTEXT

二、TEXT

三、MEDIUMTEXT

四、LONGTEXT

20、什麼是通用 SQL 函數?

一、CONCAT(A, B) –  鏈接兩個字符串值以建立單個字符串輸出。一般用於將兩個或多個字段合併爲一個字段。

二、FORMAT(X, D)- 格式化數字 X 到 D 有效數字。

三、CURRDATE(), CURRTIME()- 返回當前日期或時間。

四、NOW() – 將當前日期和時間做爲一個值返回。

五、MONTH(), DAY( ), YEAR(), WEEK(), WEEKDAY() – 從日期值中提取給定數據。

六、HOUR(), MINUTE(), SECOND() – 從時間值中提取給定數據。

七、DATEDIFF( A, B) – 肯定兩個日期之間的差別, 一般用於計算年齡

八、SUBTIMES( A, B) – 肯定兩次之間的差別。

九、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四、列的字符串類型能夠是什麼?

字符串類型是: 一、SET

二、BLOB

三、ENUM

四、CHAR

五、TEXT

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

一、設計良好的數據庫結構, 容許部分數據冗餘, 儘可能避免 join 查詢, 提升效率。

二、選擇合適的表字段數據類型和存儲引擎, 適當的添加索引。

三、MySQL 庫主從讀寫分離。

四、找規律分表, 減小單表中的數據量提升查詢速度。五、添加緩存機制, 好比 memcached, apc 等。

六、不常常改動的頁面, 生成靜態頁面。

七、書寫高效率的 SQL。好比 SELECT * FROM TABEL 改成 SELECT field_1, field_2, field_3 FROM TABLE.

2六、鎖的優化策略

一、讀寫分離

二、分段加鎖

三、減小鎖持有的時間

  1. 多個線程儘可能以相同的順序去獲取資源

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

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

B+樹, 通過優化的 B+樹

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

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

一、以「%」 開頭的  LIKE 語句, 模糊匹配

二、OR 語句先後沒有同時使用索引

三、數據類型出現隱式轉化( 如 varchar 不加單引號的話可能會自動轉換爲 int 型)

2九、實踐中如何優化 MySQL

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

一、SQL 語句及索引的優化

二、數據庫表結構的優化

三、系統配置的優化

四、硬件的優化

30、優化數據庫的方法

一、選取最適用的字段屬性,儘量減小定義字段寬度,儘可能把字段設置 NOTNULL, 例如’ 省份’、’ 性別’ 最好適用 ENUM

二、使用鏈接(JOIN)來代替子查詢

三、適用聯合(UNION)來代替手動建立的臨時表

四、事務處理

五、鎖定表、優化事務處理

六、適用外鍵, 優化鎖定表

七、創建索引

八、優化查詢語句

3一、簡單描述 MySQL 中,索引,主鍵,惟一索引,聯合索引

的區別,對數據庫的性能有什麼影響(從讀寫兩方面)

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

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

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

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

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

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

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

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

事務特性:

一、原子性: 即不可分割性, 事務要麼所有被執行, 要麼就所有不被執行。

二、一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另外一種正確狀   態

三、隔離性。在事務正確提交以前,不容許把該事務對數據的任何改變提供給任何   其餘事務,

四、持久性。事務正確提交後, 其結果將永久保存在數據庫中, 即便在事務提交後有了其餘故障, 事務的處理結果也會獲得保存。或者這樣理解:事務就是被綁定在一塊兒做爲一個邏輯工做單元的 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)。

分爲如下四類:

一、實體完整性: 規定表的每一行在表中是唯一的實體。

二、域完整性:是指表中的列必須知足某種特定的數據類型約束,其中約束又包括   取值範圍、精度等規定。

三、參照完整性:   是指兩個表的主關鍵字和外關鍵字的數據應一致,保證了表之間的數據的一致性, 防止了數據丟失或無心義的數據在數據庫中擴散。

四、用戶定義的完整性:不一樣的關係數據庫系統根據其應用環境的不一樣,每每還需   要一些特殊的約束條件。用戶定義的完整性便是針對某個特定關係數據庫的約束條件, 它反映某一具體應用必須知足的語義要求。

與表有關的約束:包括列約束(NOT NULL( 非空約束))和表約束(PRIMARY KEY、foreign key、check、UNIQUE) 。

福利領取 更多面試題關注B哥公衆號:java2b(微信搜索)

相關文章
相關標籤/搜索