詳細版本的MySQL面試題
01. 列舉常見的關系型數據庫和非關系型都有那些?
1.關系型數據庫通過外鍵關聯來建立表與表之間的關系,---------常見的有:SQLite、Oracle、mysql
2.非關系型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關系通過每個對象自身的屬性來決定 ---常見的有:MongoDb、redis
02. MySQL常見數據庫引擎及比較?
MyISAM:默認的MySQL插件式存儲引擎,它是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。
· InnoDB:用於事務處理應用程序,具有眾多特性,包括ACID事務支持。(提供行級鎖)
· BDB:可替代InnoDB的事務引擎,支持COMMIT、ROLLBACK和其他事務特性。
· Memory:將所有數據保存在RAM中,在需要快速查找引用和其他類似數據的環境下,可提供極快的訪問。
· Merge:允許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一起,並作為1個對象引用它們。對於諸如數據倉儲等VLDB環境十分適合。
· Archive:為大量很少引用的歷史、歸檔、或安全審計信息的存儲和檢索提供了完美的解決方案。
· Federated:能夠將多個分離的MySQL服務器鏈接起來,從多個物理服務器創建一個邏輯數據庫。十分適合於分布式環境或數據集市環境。
· Cluster/NDB:MySQL的簇式數據庫引擎,尤其適合於具有高性能查找要求的應用程序,這類查找需求還要求具有最高的正常工作時間和可用性。 · Other:其他存儲引擎包括CSV(引用由逗號隔開的用作數據庫表的文件),Blackhole(用於臨時禁止對數據庫的應用程序輸入),以及Example引擎(可為快速創建定制的插件式存儲引擎提供幫助)。
一般來說不使用事務的話,請使用MyISAM引擎,使用事務的話,一般使用InnoDB ------仙子啊學習現在我們用的主要是InnoDB 註意,通過更改STORAGE_ENGINE配置變量,能夠方便地更改MySQL服務器的默認存儲引擎。
03. 簡述數據三大範式?
什麽是範式:簡言之就是,數據庫設計對數據的存儲性能,還有開發人員對數據的操作都有莫大的關系。所以建立科學的,規範的的數據庫是需要滿足一些 規範的來優化數據數據存儲方式。在關系型數據庫中這些規範就可以稱為範式。
什麽是三大範式:
第一範式:當關系模式R的所有屬性都不能在分解為更基本的數據單位時,稱R是滿足第一範式的,簡記為1NF。滿足第一範式是關系模式規範化的最低要 求,否則,將有很多基本操作在這樣的關系模式中實現不了。
第二範式:如果關系模式R滿足第一範式,並且R得所有非主屬性都完全依賴於R的每一個候選關鍵屬性,稱R滿足第二範式,簡記為2NF。
第三範式:設R是一個滿足第一範式條件的關系模式,X是R的任意屬性集,如果X非傳遞依賴於R的任意一個候選關鍵字,稱R滿足第三範式,簡記為3NF. 註:關系實質上是一張二維表,其中每一行是一個元組,每一列是一個屬性
04. 什麽是事務?MySQL如何支持事務?
事務就是一段sql 語句的批處理,但是這個批處理是一個原子 ,不可分割,要麽都執行,要麽回滾(rollback)都不執行。
事務具體四大特性,也就是經常說的ACID :
1.原子性(所有操作要麽全部成功,要麽全部失敗回滾)
2.一致性(事務執行之前和執行之後都必須處於一致性狀態。)
3.隔離性(數據庫為每一個用戶開啟的事務,不能被其他事務的操作所幹擾,多個並發事務之間要相互隔離)
4.持久性(一個事務一旦被提交了,那麽對數據庫中的數據的改變就是永久性的,即使遭遇故障依然能夠通過日誌恢復最後一次更新) 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務
MYSQL 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實現 BEGIN 開始一個事務 ROLLBACK 事務回滾 COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式: SET AUTOCOMMIT=0 禁止自動提交 SET AUTOCOMMIT=1 開啟自動提交
05. 簡述數據庫設計中一對多和多對多的應用場景?
一對多:學生與班級---一個學生只能屬於一個班級,一個班級可以有多個學生
多對多:學生與課程---一個學生可以選擇多個課程,一個課程也可以被多個學生選擇
06. 如何基於數據庫實現商城商品計數器?
創建一個商城表---包含(id,商品名,每一個商品對應數量)
create table product
(id primary key auto_increment,
pname varchar(64),
pcount int);
07. 簡述觸發器、函數、視圖、存儲過程?
觸發器:觸發器是一個特殊的存儲過程,它是MySQL在insert、update、delete的時候自動執行的代碼塊。
create trigger trigger_name
after/before insert /update/delete on 表名
for each row
begin
sql語句:(觸發的語句一句或多句)
end
函數:MySQL中提供了許多內置函數,還可以自定義函數(實現程序員需要sql邏輯處理)
自定義函數創建語法:
創建:CREATE FUNCTION 函數名稱(參數列表)
RETURNS 返回值類型 函數體
修改: ALTER FUNCTION 函數名稱 [characteristic ...]
刪除:DROP FUNCTION [IF EXISTS] 函數名稱
調用:SELECT 函數名稱(參數列表)
視圖:視圖是由查詢結果形成的一張虛擬表,是表通過某種運算得到的一個投影
create view view_name as select 語句
存儲過程:把一段代碼封裝起來,當要執行這一段代碼的時候,可以通過調用該存儲過程來實現(經過第一次編譯後再次調用不需要再次編譯,比一個個執行sql語句效率高)
create procedure 存儲過程名(參數,參數,…)
begin
//代碼
end
08. MySQL索引種類
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度
MySQL索引的類型:
1. 普通索引:這是最基本的索引,它沒有任何限制
2.唯一索引:索引列的值必須唯一,但允許有空值,如果是組合索引,則列值的組合必須唯一
3.全文索引:全文索引僅可用於 MyISAM 表,可以從CHAR、VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被創建,或是隨後使用ALTER TABLE 或CREATE INDEX被添加 (切記對於大容量的數據表,生成全文索引是一個非常消耗時間非常消耗硬盤空間的做法)
4. 單列索引、多列索引:多個單列索引與單個多列索引的查詢效果不同,因為執行查詢時,MySQL只能使用一個索引,會從多個索引中選擇一個限制最為嚴格的索引。
5.組合索引(最左前綴):簡單的理解就是只從最左面的開始組合(實在單列索引的基礎上進一步壓榨索引效率的一種方式)
09. 索引在什麽情況下遵循最左前綴的規則?
mysql在使用組合索引查詢的時候需要遵循“最左前綴”規則
10. 主鍵和外鍵的區別?
1.主鍵是能確定一條記錄的唯一標識
2.外鍵用於與另一張表的關聯,是能確定另一張表記錄的字段,用於保持數據的一致性
11. MySQL常見的函數?
聚合函數:
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的個數
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由屬於一組的列值連接組合而成的結果
數學函數:
ABS(x) 返回x的絕對值
BIN(x) 返回x的二進制(OCT返回八進制,HEX返回十六進制)
12. 列舉創建索引但是無法命中索引的8種情況。
1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麽盡量少用or的原因)
2.對於多列索引,不是使用的第一部分,則不會使用索引
3.like查詢是以%開頭
4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引
6 對小表查詢
7 提示不使用索引
8 統計數據不真實
9.單獨引用復合索引裏非第一位置的索引列.
13. 如何開啟慢日誌查詢?
1 執行 SHOW VARIABLES LIKE “%slow%”,獲知 mysql 是否開啟慢查詢 slow_query_log 慢查詢開啟狀態 OFF 未開啟 ON 為開啟 slow_query_log_file 慢查詢日誌存放的位置(這個目錄需要MySQL的運行帳號的可寫權限,一般設置為MySQL的數據存放目錄)
2 修改配置文件( 放在[mysqld]下),重啟 long_query_time 查詢超過多少秒才記錄
3 測試是否成功
4 慢查詢日誌文件的信息格式
14. 數據庫導入導出命令(結構+數據)?
1.導出整個數據庫
mysqldump -u用戶名 -p密碼 數據庫名 > 導出的文件名
例如:C:\Users\jack> mysqldump -uroot -pmysql sva_rec > e:\sva_rec.sql
2.導出一個表,包括表結構和數據
mysqldump -u用戶名 -p 密碼 數據庫名 表名> 導出的文件名
例如:C:\Users\jack> mysqldump -uroot -pmysql sva_rec date_rec_drv> e:\date_rec_drv.sql
3.導出一個數據庫結構
例如:C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec > e:\sva_rec.sql
4.導出一個表,只有表結構
mysqldump -u用戶名 -p 密碼 -d數據庫名 表名> 導出的文件名
例如:C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec date_rec_drv> e:\date_rec_drv.sql
5.導入數據庫
常用source 命令
進入mysql數據庫控制臺,
如mysql -u root -p mysql>use 數據庫
然後使用source命令,後面參數為腳本文件(如這裏用到的.sql)
mysql>source d:wcnc_db.sql
15. 數據庫優化方案?
總體思路從以下幾個方面:
1、選取最適用的字段屬性
2、使用連接(JOIN)來代替子查詢(Sub-Queries)
3、使用聯合(UNION)來代替手動創建的臨時表
4、事務(當多個用戶同時使用相同的數據源時,它可以利用鎖定數據庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所幹擾)
5.鎖定表(有些情況下我們可以通過鎖定表的方法來獲得更好的性能)
6、使用外鍵(鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵)
7、使用索引
8、優化的查詢語句(絕大多數情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當的話,索引將無法發揮它應有的作用)
16. char和varchar的區別?
char:定長,char的存取數度相對快
varchar:不定長,存取速度相對慢
到底如何取舍可以根據一下幾個方面考慮:
1、對於MyISAM表,盡量使用Char,對於那些經常需要修改而容易形成碎片的myisam和isam數據表就更是如此,它的缺點就是占用磁盤空間;
2、對於InnoDB表,因為它的數據行內部存儲格式對固定長度的數據行和可變長度的數據行不加區分(所有數據行共用一個表頭部分,這個標頭部分存放著指向各有關數據列的指針), 所以使用char類型不見得會比使用varchar類型好。事實上,因為char類型通常要比varchar類型占用更多的空間,所以從減少空間占用量和減少磁盤i/o的角度,使用varchar類型反而更有利;
3、存儲很短的信息,比如門牌號碼101,201……這樣很短的信息應該用char,因為varchar還要占個byte用於存儲信息長度,本來打算節約存儲的現在得不償失。
4、固定長度的。比如使用uuid作為主鍵,那用char應該更合適。因為他固定長度,varchar動態根據長度的特性就消失了,而且還要占個長度信息。
5、十分頻繁改變的column。因為varchar每次存儲都要有額外的計算,得到長度等工作,如果一個非常頻繁改變的,那就要有很多的精力用於計算,而這些對於char來說是不需要的。
17. 簡述MySQL的執行計劃?
執行計劃explain命令是查看查詢優化器如何決定執行查詢的主要方法。
這個功能有局限性,並不總會說出真相,但它的輸出是可以獲取的最好信息,通過輸出結果反推執行過程
18. 在對name做了唯一索引前提下,簡述以下區別:
select * from tb where name = ‘Oldboy’ -------------查找到tb表中所有name = ‘Oldboy’的數據
select * from tb where name = ‘Oldboy’ limit 1------查找到tb表中所有name = ‘Oldboy’的數據只取其中的第一條
詳細版本的MySQL面試題