MySQL常見面試題與答案整理

1、MySQL 中有哪幾種鎖?
1、表級鎖: 開銷小, 加鎖快; 不會出現(xiàn)死鎖; 鎖定粒度大, 發(fā)生鎖沖突的概率最高, 并發(fā)度最低。
2、行級鎖: 開銷大, 加鎖慢; 會出現(xiàn)死鎖; 鎖定粒度最小, 發(fā)生鎖沖突的概率最低, 并發(fā)度也最高。
3、頁面鎖: 開銷和加鎖時間界于表鎖和行鎖之間; 會出現(xiàn)死鎖; 鎖定粒度界于表鎖和行鎖之間, 并發(fā)度一般。
2、MySQL 中有哪些不同的表格?
共有 5 種類型的表格: 1、MyISAM2、Heap 3、Merge 4、INNODB 5、MISAM
3、簡述在MySQL 數(shù)據(jù)庫中 MyISAM 和InnoDB 的區(qū)別
MyISAM:
不支持事務, 但是每次查詢都是原子的; 支持表級鎖, 即每次操作是對整個表加鎖; 存儲表的總行數(shù);
一個 MYISAM 表有三個文件: 索引文件、表結構文件、數(shù)據(jù)文件;
采用菲聚集索引, 索引文件的數(shù)據(jù)域存儲指向數(shù)據(jù)文件的指針。輔索引與主索引基本一致, 但是輔索引不用保證唯一性。
InnoDb:
支持 ACID 的事務, 支持事務的四種隔離級別; 支持行級鎖及外鍵約束: 因此可以支持寫并發(fā); 不存儲總行數(shù):
一個 InnoDb 引擎存儲在一個文件空間( 共享表空間, 表大小不受操作系統(tǒng)控制,
一個表可能分布在多個文件里), 也有可能為多個( 設置為獨立表空, 表大小受操作系統(tǒng)文件大小限制, 一般為 2G), 受操作系統(tǒng)文件大小的限制;
主鍵索引采用聚集索引( 索引的數(shù)據(jù)域存儲數(shù)據(jù)文件本身), 輔索引的數(shù)據(jù)域存儲主鍵的值; 因此從輔索引查找數(shù)據(jù), 需要先通過輔索引找到主鍵值, 再訪問輔索引; 最好使用自增主鍵, 防止插入數(shù)據(jù)時, 為維持 B+樹結構, 文件的大調整。
4、MySQL 中InnoDB 支持的四種事務隔離級別名稱,以及逐
級之間的區(qū)別?SQL 標準定義的四個隔離級別為:
1、read uncommited : 讀到未提交數(shù)據(jù)
2、read committed: 臟讀, 不可重復讀
3、repeatable read: 可重讀
4、serializable : 串行事物
5、CHAR 和VARCHAR 的區(qū)別?
1、CHAR 和 VARCHAR 類型在存儲和檢索方面有所不同
2、CHAR 列長度固定為創(chuàng)建表時聲明的長度, 長度值范圍是 1 到 255 當 CHAR 值被存儲時, 它們被用空格填充到特定長度, 檢索 CHAR 值時需刪除尾隨空格。
6、主鍵和候選鍵有什么區(qū)別?
表格的每一行都由主鍵唯一標識,一個表只有一個主鍵。
主鍵也是候選鍵。按照慣例, 候選鍵可以被指定為主鍵, 并且可以用于任何外鍵引用。
7、myisamchk 是用來做什么的?
它用來壓縮 MyISAM 表, 這減少了磁盤或內(nèi)存使用。
MyISAM Static 和 MyISAM Dynamic 有什么區(qū)別?
在 MyISAM Static 上的所有字段有固定寬度。動態(tài) MyISAM 表將具有像 TEXT, BLOB 等字段, 以適應不同長度的數(shù)據(jù)類型。
MyISAM Static 在受損情況下更容易恢復。
8、如果一個表有一列定義為TIMESTAMP,將發(fā)生什么?
每當行被更改時, 時間戳字段將獲取當前時間戳。列設置為 AUTO INCREMENT 時, 如果在表中達到最大值, 會發(fā)生什么情況?它會停止遞增, 任何進一步的插入都將產(chǎn)生錯誤, 因為密鑰已被使用。
怎樣才能找出最后一次插入時分配了哪個自動增量?LAST_INSERT_ID 將返回由 Auto_increment 分配的最后一個值, 并且不需要指定表名稱。
9、你怎么看到為表格定義的所有索引?
索引是通過以下方式為表格定義的:
SHOW INDEX FROM ;
10、LIKE 聲明中的%和_是什么意思?% 對應于 0 個或更多字符,_只是 LIKE 語句中的一個字符。
如何在 Unix 和 MySQL 時間戳之間進行轉換?UNIX_TIMESTAMP 是從 MySQL 時間戳轉換為 Unix 時間戳的命令FROM_UNIXTIME 是從 Unix 時間戳轉換為 MySQL 時間戳的命令
11、列對比運算符是什么?
在 SELECT 語句的列比較中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND, OR 或 LIKE 運算符。
12、BLOB 和TEXT 有什么區(qū)別?
BLOB 是一個二進制對象, 可以容納可變數(shù)量的數(shù)據(jù)。TEXT 是一個不區(qū)分大小寫的 BLOB。
BLOB 和 TEXT 類型之間的唯一區(qū)別在于對 BLOB 值進行排序和比較時區(qū)分大小寫, 對 TEXT 值不區(qū)分大小寫。
13、MySQL_fetch_array 和MySQL_fetch_object 的區(qū)別是什么?
以下是 MySQL_fetch_array 和 MySQL_fetch_object 的區(qū)別:
MySQL_fetch_array( ) – 將結果行作為關聯(lián)數(shù)組或來自數(shù)據(jù)庫的常規(guī)數(shù)組返回。 MySQL_fetch_object – 從數(shù)據(jù)庫返回結果行作為對象。
14、MyISAM 表格將在哪里存儲,并且還提供其存儲格式?
每個 MyISAM 表格以三種格式存儲在磁盤上:
·“.frm” 文件存儲表定義
·數(shù)據(jù)文件具有“.MYD”( MYData)
擴展名索引文件具有“.MYI”( MYIndex) 擴展名
15、MySQL 如何優(yōu)化DISTINCT?
DISTINCT 在所有列上轉換為 GROUP BY, 并與 ORDER BY 子句結合使用。SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
16、如何顯示前 50 行?
在 MySQL 中, 使用以下代碼查詢顯示前 50 行: SELECT*FROM TABLE LIMIT 0,50;
17、可以使用多少列創(chuàng)建索引?
任何標準表最多可以創(chuàng)建 16 個索引列。
18、NOW()和 CURRENT_DATE()有什么區(qū)別?
NOW() 命令用于顯示當前年份, 月份, 日期, 小時, 分鐘和秒。CURRENT_DATE() 僅顯示當前年份, 月份和日期。
19、什么是非標準字符串類型?
1、TINYTEXT
2、TEXT
3、MEDIUMTEXT
4、LONGTEXT
20、什么是通用 SQL 函數(shù)?
1、CONCAT(A, B) – 連接兩個字符串值以創(chuàng)建單個字符串輸出。通常用于將兩個或多個字段合并為一個字段。
2、FORMAT(X, D)- 格式化數(shù)字 X 到 D 有效數(shù)字。
3、CURRDATE(), CURRTIME()- 返回當前日期或時間。
4、NOW() – 將當前日期和時間作為一個值返回。
5、MONTH(), DAY( ), YEAR(), WEEK(), WEEKDAY() – 從日期值中提取給定數(shù)據(jù)。
6、HOUR(), MINUTE(), SECOND() – 從時間值中提取給定數(shù)據(jù)。
7、DATEDIFF( A, B) – 確定兩個日期之間的差異, 通常用于計算年齡
8、SUBTIMES( A, B) – 確定兩次之間的差異。
9、FROMDAYS( INT) – 將整數(shù)天數(shù)轉換為日期值。
21、MySQL 支持事務嗎?
在缺省模式下,MySQL 是 autocommit 模式的,所有的數(shù)據(jù)庫更新操作都會即時提交, 所以在缺省情況下, MySQL 是不支持事務的。
但是如果你的 MySQL 表類型是使用 InnoDB Tables 或 BDB tables 的話, 你的MySQL 就可以使用事務處理,使用 SET
AUTOCOMMIT=0 就可以使 MySQL 允許在非 autocommit 模式, 在非
autocommit 模式下,你必須使用 COMMIT 來提交你的更改,或者用 ROLLBACK 來回滾你的更改。
22、MySQL 里記錄貨幣用什么字段類型好
NUMERIC 和 DECIMAL 類型被 MySQL 實現(xiàn)為同樣的類型, 這在 SQL92 標準允許。他們被用于保存值, 該值的準確精度是極其重要的值, 例如與金錢有關的數(shù)據(jù)。當聲明一個類是這些類型之一時, 精度和規(guī)模的能被(并且通常是)指定。
例如:
salary DECIMAL(9,2)
在這個例子中, 9(precision)代表將被用于存儲值的總的小數(shù)位數(shù),而 2(scale)代表將被用于存儲小數(shù)點后的位數(shù)。因此, 在這種情況下, 能被存儲在 salary 列中的值的范圍是從-9999999.99 到9999999.99。
23、MySQL 有關權限的表都有哪幾個?
MySQL 服務器通過權限表來控制用戶對數(shù)據(jù)庫的訪問, 權限表存放在 MySQL 數(shù)據(jù)庫里,由 MySQL_install_db 腳本初始化。這些權限表分別 user,db,table_priv, columns_priv 和 host 。
24、列的字符串類型可以是什么?
字符串類型是: 1、SET
2、BLOB
3、ENUM
4、CHAR
5、TEXT
25、MySQL 數(shù)據(jù)庫作發(fā)布系統(tǒng)的存儲,一天五萬條以上的增量, 預計運維三年,怎么優(yōu)化?
1、設計良好的數(shù)據(jù)庫結構, 允許部分數(shù)據(jù)冗余, 盡量避免 join 查詢, 提高效率。
2、選擇合適的表字段數(shù)據(jù)類型和存儲引擎, 適當?shù)奶砑铀饕?br />
3、MySQL 庫主從讀寫分離。
4、找規(guī)律分表, 減少單表中的數(shù)據(jù)量提高查詢速度。5、添加緩存機制, 比如 memcached, apc 等。
6、不經(jīng)常改動的頁面, 生成靜態(tài)頁面。
7、書寫高效率的 SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.
26、鎖的優(yōu)化策略
1、讀寫分離
2、分段加鎖
3、減少鎖持有的時間
多個線程盡量以相同的順序去獲取資源
不能將鎖的粒度過于細化, 不然可能會出現(xiàn)線程的加鎖和釋放次數(shù)過多, 反而效率不如一次加一把大鎖。
27、索引的底層實現(xiàn)原理和優(yōu)化
B+樹, 經(jīng)過優(yōu)化的 B+樹
主要是在所有的葉子結點中增加了指向下一個葉子節(jié)點的指針, 因此 InnoDB 建議為大部分表使用默認自增的主鍵作為主索引。
28、什么情況下設置了索引但無法使用
1、以“%” 開頭的 LIKE 語句, 模糊匹配
2、OR 語句前后沒有同時使用索引
3、數(shù)據(jù)類型出現(xiàn)隱式轉化( 如 varchar 不加單引號的話可能會自動轉換為 int 型)
29、實踐中如何優(yōu)化 MySQL
最好是按照以下順序優(yōu)化:
1、SQL 語句及索引的優(yōu)化
2、數(shù)據(jù)庫表結構的優(yōu)化
3、系統(tǒng)配置的優(yōu)化
4、硬件的優(yōu)化
30、優(yōu)化數(shù)據(jù)庫的方法
1、選取最適用的字段屬性,盡可能減少定義字段寬度,盡量把字段設置 NOTNULL, 例如’ 省份’、’ 性別’ 最好適用 ENUM
2、使用連接(JOIN)來代替子查詢
3、適用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表
4、事務處理
5、鎖定表、優(yōu)化事務處理
6、適用外鍵, 優(yōu)化鎖定表
7、建立索引
8、優(yōu)化查詢語句
31、簡單描述 MySQL 中,索引,主鍵,唯一索引,聯(lián)合索引
的區(qū)別,對數(shù)據(jù)庫的性能有什么影響(從讀寫兩方面)
索引是一種特殊的文件(InnoDB 數(shù)據(jù)表上的索引是表空間的一個組成部分), 它們包含著對數(shù)據(jù)表里所有記錄的引用指針。
普通索引(由關鍵字 KEY 或 INDEX 定義的索引)的唯一任務是加快對數(shù)據(jù)的訪問速度。
普通索引允許被索引的數(shù)據(jù)列包含重復的值。如果能確定某個數(shù)據(jù)列將只包含彼此各不相同的值, 在為這個數(shù)據(jù)列創(chuàng)建索引的時候就應該用關鍵字 UNIQUE 把它定義為一個唯一索引。也就是說, 唯一索引可以保證數(shù)據(jù)記錄的唯一性。
主鍵, 是一種特殊的唯一索引, 在一張表中只能定義一個主鍵索引, 主鍵用于唯一標識一條記錄, 使用關鍵字 PRIMARY KEY 來創(chuàng)建。
索引可以覆蓋多個數(shù)據(jù)列,如像 INDEX(columnA, columnB)索引,這就是聯(lián)合索引。
索引可以極大的提高數(shù)據(jù)的查詢速度, 但是會降低插入、刪除、更新表的速度, 因為在執(zhí)行這些寫操作時, 還要操作索引文件。
32、數(shù)據(jù)庫中的事務是什么?
事務( transaction) 是作為一個單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功, 則認為事務成功, 即使只有一個操作失敗, 事務也不成功。如果所有操作完成, 事務則提交, 其修改將作用于所有其他數(shù)據(jù)庫進程。如果一個操作失敗, 則事務將回滾, 該事務所有操作的影響都將取消。
事務特性:
1、原子性: 即不可分割性, 事務要么全部被執(zhí)行, 要么就全部不被執(zhí)行。
2、一致性或可串性。事務的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉換成另一種正確狀 態(tài)
3、隔離性。在事務正確提交之前,不允許把該事務對數(shù)據(jù)的任何改變提供給任何 其他事務,
4、持久性。事務正確提交后, 其結果將永久保存在數(shù)據(jù)庫中, 即使在事務提交后有了其他故障, 事務的處理結果也會得到保存?;蛘哌@樣理解:事務就是被綁定在一起作為一個邏輯工作單元的 SQL 語句分組, 如果任何一個語句操作失敗那么整個操作就被失敗, 以后操作就會回滾到操作前狀態(tài), 或者是上有個節(jié)點。為了確保要么執(zhí)行, 要么不執(zhí)行, 就可以使用事務。要將有組語句作為事務考慮, 就需要通過 ACID 測試, 即原子性, 一致性, 隔離性和持久性。
33、SQL 注入漏洞產(chǎn)生的原因?如何防止?
SQL 注入產(chǎn)生的原因: 程序開發(fā)過程中不注意規(guī)范書寫 sql 語句和對特殊字符進行過濾,導致客戶端可以通過全局變量 POST 和 GET 提交一些 sql 語句正常執(zhí)行。防止 SQL 注入的方式:
開啟配置文件中的 magic_quotes_gpc 和 magic_quotes_runtime 設置
執(zhí)行 sql 語句時使用 addslashes 進行 sql 語句轉換Sql 語句書寫盡量不要省略雙引號和單引號。
過濾掉 sql 語句中的一些關鍵詞: update、insert、delete、select、 * 。
提高數(shù)據(jù)庫表和字段的命名技巧, 對一些重要的字段根據(jù)程序的特點命名, 取不易被猜到的。
34、為表中得字段選擇合適得數(shù)據(jù)類型
字段類型優(yōu)先級: 整形>date,time>enum,char>varchar>blob,text
優(yōu)先考慮數(shù)字類型, 其次是日期或者二進制類型, 最后是字符串類型, 同級別得數(shù)據(jù)類型, 應該優(yōu)先選擇占用空間小的數(shù)據(jù)類型
35、存儲時期
Datatime:以 YYYY-MM-DD HH:MM:SS 格式存儲時期時間, 精確到秒, 占用 8 個字節(jié)得存儲空間, datatime 類型與時區(qū)無關
Timestamp:以時間戳格式存儲,占用 4 個字節(jié),范圍小 1970-1-1 到 2038-1-19, 顯示依賴于所指定得時區(qū), 默認在第一個列行的數(shù)據(jù)修改時可以自動得修改timestamp 列得值 Date:( 生日) 占用得字節(jié)數(shù)比使用字符串.datatime.int 儲存要少, 使用 date 只需要 3 個字節(jié), 存儲日期月份, 還可以利用日期時間函數(shù)進行日期間得計算Time:存儲時間部分得數(shù)據(jù)
注意:不要使用字符串類型來存儲日期時間數(shù)據(jù)( 通常比字符串占用得儲存空間小, 在進行查找過濾可以利用日期得函數(shù))使用 int 存儲日期時間不如使用 timestamp 類型
36、對于關系型數(shù)據(jù)庫而言,索引是相當重要的概念,請回答
有關索引的幾個問題:
1、索引的目的是什么?
快速訪問數(shù)據(jù)表中的特定信息, 提高檢索速度
創(chuàng)建唯一性索引, 保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。加速表和表之間的連接
使用分組和排序子句進行數(shù)據(jù)檢索時, 可以顯著減少查詢中分組和排序的時間2、索引對數(shù)據(jù)庫系統(tǒng)的負面影響是什么?
負面影響:
創(chuàng)建索引和維護索引需要耗費時間, 這個時間隨著數(shù)據(jù)量的增加而增加; 索引需要占用物理空間, 不光是表需要占用數(shù)據(jù)空間, 每個索引也需要占用物理空間; 當對表進行增、刪、改、的時候索引也要動態(tài)維護, 這樣就降低了數(shù)據(jù)的維護速度。
3、為數(shù)據(jù)表建立索引的原則有哪些?
在最頻繁使用的、用以縮小查詢范圍的字段上建立索引。 在頻繁使用的、需要排序的字段上建立索引
4、什么情況下不宜建立索引?
對于查詢中很少涉及的列或者重復值比較多的列, 不宜建立索引。對于一些特殊的數(shù)據(jù)類型, 不宜建立索引, 比如文本字段( text) 等
37、解釋 MySQL 外連接、內(nèi)連接與自連接的區(qū)別
先說什么是交叉連接: 交叉連接又叫笛卡爾積,它是指不使用任何條件,直接將一個表的所有記錄和另一個表中的所有記錄一一匹配。內(nèi)連接 則是只有條件的交叉連接,根據(jù)某個條件篩選出符合條件的記錄,不符合條件的記錄不會出現(xiàn)在結果集中, 即內(nèi)連接只連接匹配的行。
外連接 其結果集中不僅包含符合連接條件的行,而且還會包括左表、右表或兩個表中
的所有數(shù)據(jù)行, 這三種情況依次稱之為左外連接, 右外連接, 和全外連接。左外連接, 也稱左連接, 左表為主表, 左表中的所有記錄都會出現(xiàn)在結果集中, 對于那些在右表中并沒有匹配的記錄, 仍然要顯示, 右邊對應的那些字段值以NULL 來填充。右外連接,也稱右連接,右表為主表,右表中的所有記錄都會出現(xiàn)在結果集中。左連接和右連接可以互換, MySQL 目前還不支持全外連接。
38、Myql 中的事務回滾機制概述
事務是用戶定義的一個數(shù)據(jù)庫操作序列, 這些操作要么全做要么全不做, 是一個不可分割的工作單位, 事務回滾是指將該事務已經(jīng)完成的對數(shù)據(jù)庫的更新操作撤銷。要同時修改數(shù)據(jù)庫中兩個不同表時, 如果它們不是一個事務的話, 當?shù)谝粋€表修改完, 可能第二個表修改過程中出現(xiàn)了異常而沒能修改, 此時就只有第二個表依舊是未修改之前的狀態(tài), 而第一個表已經(jīng)被修改完畢。而當你把它們設定為一個事務的時候, 當?shù)谝粋€表修改完, 第二表修改出現(xiàn)異常而沒能修改, 第一個表和第二個表都要回到未修改的狀態(tài), 這就是所謂的事務回滾
39、SQL 語言包括哪幾部分?每部分都有哪些操作關鍵字?
SQL 語言包括數(shù)據(jù)定義(DDL)、數(shù)據(jù)操縱(DML),數(shù)據(jù)控制(DCL)和數(shù)據(jù)查詢( DQL) 四個部分。
數(shù)據(jù)定義: Create Table,Alter Table,Drop Table, Craete/Drop Index 等數(shù)據(jù)操縱: Select ,insert,update,delete,數(shù)據(jù)控制: grant,revoke 數(shù)據(jù)查詢: select
40、完整性約束包括哪些?
數(shù)據(jù)完整性(Data Integrity)是指數(shù)據(jù)的精確(Accuracy)和可靠性(Reliability)。
分為以下四類:
1、實體完整性: 規(guī)定表的每一行在表中是惟一的實體。
2、域完整性:是指表中的列必須滿足某種特定的數(shù)據(jù)類型約束,其中約束又包括 取值范圍、精度等規(guī)定。
3、參照完整性: 是指兩個表的主關鍵字和外關鍵字的數(shù)據(jù)應一致,保證了表之間的數(shù)據(jù)的一致性, 防止了數(shù)據(jù)丟失或無意義的數(shù)據(jù)在數(shù)據(jù)庫中擴散。
4、用戶定義的完整性:不同的關系數(shù)據(jù)庫系統(tǒng)根據(jù)其應用環(huán)境的不同,往往還需 要一些特殊的約束條件。用戶定義的完整性即是針對某個特定關系數(shù)據(jù)庫的約束條件, 它反映某一具體應用必須滿足的語義要求。
與表有關的約束:包括列約束(NOT NULL( 非空約束))和表約束(PRIMARY KEY、foreign key、check、UNIQUE) 。
到此這篇關于MySQL常見面試題與答案整理的文章就介紹到這了,更多相關MySQL面試題 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!
相關文章
- 這篇文章主要介紹了mysql常見筆試題小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-19
- 這篇文章主要介紹了Mysql版sql語句練習50題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-04-01
- 這篇文章主要介紹了Mysql索引面試題的小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-10
- 這篇文章主要介紹了MySQL常見面試題(小結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-02-17
- 這篇文章主要介紹了去BAT面試完的Mysql面試題總結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-12-19
- 這篇文章主要介紹了100道MySQL常見面試題總結,本文主要受眾為開發(fā)人員,所以不涉及到MySQL的服務部署等操作,且內(nèi)容較多,感興趣的可以了解一下2019-08-22
- 這篇文章主要介紹了20個MySQL經(jīng)典面試題的相關資料,并在下面整理好了答案,方便使用,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習2019-04-10
- 這篇文章主要介紹了MySQL數(shù)據(jù)庫選擇題小結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-02-07