数据库和MySQL相关面试题目
數(shù)據(jù)庫(kù)理論
1.觸發(fā)器的作用?
觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,主要是通過(guò)事件來(lái)觸發(fā)而被執(zhí)行的。它可以強(qiáng)化約束,來(lái)維護(hù)數(shù)據(jù)的完整性和一致性,可以跟蹤數(shù)據(jù)庫(kù)內(nèi)的操作從而不允許未經(jīng)許可的更新和變化。
可以聯(lián)級(jí)運(yùn)算。如,某表上的觸發(fā)器上包含對(duì)另一個(gè)表的數(shù)據(jù)操作,而該操作又會(huì)導(dǎo)致該表觸發(fā)器被觸發(fā)。
2.什么是存儲(chǔ)過(guò)程?用什么來(lái)調(diào)用?
存儲(chǔ)過(guò)程是一個(gè)預(yù)編譯的SQL語(yǔ)句,優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說(shuō)只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。
如果某次操作需要執(zhí)行多次SQL,使用存儲(chǔ)過(guò)程比單純SQL語(yǔ)句執(zhí)行要快。可以用一個(gè)命令對(duì)象來(lái)調(diào)用存儲(chǔ)過(guò)程。
3.索引的作用?和它的優(yōu)點(diǎn)缺點(diǎn)是什么?
索引就是一種特殊的查詢表,數(shù)據(jù)庫(kù)的搜索引擎可以利用它加速對(duì)數(shù)據(jù)的檢索。它很類似與現(xiàn)實(shí)生活中書(shū)的目錄,不需要查詢整本書(shū)內(nèi)容就可以找到想要的數(shù)據(jù)。
索引可以是唯一的,創(chuàng)建索引允許指定單個(gè)列或者是多個(gè)列。缺點(diǎn)是它減慢了數(shù)據(jù)錄入的速度,同時(shí)也增加了數(shù)據(jù)庫(kù)的尺寸大小。
4.什么是內(nèi)存泄漏?
一般我們所說(shuō)的內(nèi)存泄漏指的是堆內(nèi)存的泄漏。堆內(nèi)存是程序從堆中為其分配的,大小任意的,使用完后要顯示釋放內(nèi)存。
在Java中,內(nèi)存泄漏就是存在一些被分配的對(duì)象,首先,這些對(duì)象是可達(dá)的,即在有向圖中,存在通路可以與其相連;其次,這些對(duì)象是無(wú)用的,即程序以后不會(huì)再使用這些對(duì)象。如果對(duì)象滿足這兩個(gè)條件,這些對(duì)象就可以判定為Java中的內(nèi)存泄漏,這些對(duì)象不會(huì)被GC所回收,然而它卻占用內(nèi)存。
在C++中,內(nèi)存泄漏的范圍更大一些。有些對(duì)象被分配了內(nèi)存空間,然后卻不可達(dá),由于C++中沒(méi)有GC,這些內(nèi)存將永遠(yuǎn)收不回來(lái)。在Java中,這些不可達(dá)的對(duì)象都由GC負(fù)責(zé)回收,因此程序員不需要考慮這部分的內(nèi)存泄露。
5.維護(hù)數(shù)據(jù)庫(kù)的完整性和一致性,你喜歡用觸發(fā)器還是自寫(xiě)業(yè)務(wù)邏輯?為什么?
我是這樣做的,盡可能使用約束,如check,主鍵,外鍵,非空字段等來(lái)約束,這樣做效率最高,也最方便。
其次是使用觸發(fā)器,這種方法可以保證,無(wú)論什么業(yè)務(wù)系統(tǒng)訪問(wèn)數(shù)據(jù)庫(kù)都可以保證數(shù)據(jù)的完整新和一致性。
最后考慮的是自寫(xiě)業(yè)務(wù)邏輯,但這樣做麻煩,編程復(fù)雜,效率低下。
6.什么叫視圖?游標(biāo)是什么?
視圖是一種虛擬的表,具有和物理表相同的功能??梢詫?duì)視圖進(jìn)行增,改,查,操作,視圖通常是有一個(gè)表或者多個(gè)表的行或列的子集。
對(duì)視圖的修改不影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢。
游標(biāo)是對(duì)查詢出來(lái)的結(jié)果集作為一個(gè)單元來(lái)有效的處理。
游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行??梢詫?duì)結(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時(shí)候,游標(biāo)顯得十分重要。
7.表空間的管理方式有哪幾種?
數(shù)據(jù)字典管理方式
本地文件管理方式
8.說(shuō)說(shuō)索引的組成?
索引列、rowid
9.DELETE和TRUNCATE的區(qū)別?
1、TRUNCATE在各種表上無(wú)論是大的還是小的都非常快。如果有ROLLBACK命令DELETE將被撤銷,而TRUNCATE則不會(huì)被撤銷。
2、TRUNCATE是一個(gè)DDL語(yǔ)言,向其他所有的DDL語(yǔ)言一樣,他將被隱式提交,不能對(duì)TRUNCATE使用ROLLBACK命令。
3、TRUNCATE將重新設(shè)置高水平線和所有的索引。在對(duì)整個(gè)表和索引進(jìn)行完全瀏覽時(shí),經(jīng)過(guò)TRUNCATE操作后的表比DELETE操作后的表要快得多。
4、TRUNCATE不能觸發(fā)任何DELETE觸發(fā)器。
5、不能授予任何人清空他人的表的權(quán)限。
6、當(dāng)表被清空后表和表的索引講重新設(shè)置成初始大小,而delete則不能。
7、不能清空父表。
10.什么是唯一索引?
唯一索引可以確保索引列不包含重復(fù)的值。
在多列唯一索引的情況下,該索引可以確保索引列中每個(gè)值組合都是唯一的。例如,如果在 last_name、first_name 和 middle_initial 列的組合上創(chuàng)建了唯一索引 full_name,則該表中任何兩個(gè)人都不可以具有相同的全名。
聚集索引和非聚集索引都可以是唯一的。因此,只要列中的數(shù)據(jù)是唯一的,就可以在同一個(gè)表上創(chuàng)建一個(gè)唯一的聚集索引和多個(gè)唯一的非聚集索引。
只有當(dāng)唯一性是數(shù)據(jù)本身的特征時(shí),指定唯一索引才有意義。如果必須實(shí)施唯一性以確保數(shù)據(jù)的完整性,則應(yīng)在列上創(chuàng)建 UNIQUE 或 PRIMARY KEY 約束,而不要?jiǎng)?chuàng)建唯一索引。例如,如果打算經(jīng)常查詢雇員表(主鍵為 emp_id)中的社會(huì)安全號(hào)碼 (ssn) 列,并希望確保社會(huì)安全號(hào)碼的唯一性,則在 ssn 列上創(chuàng)建 UNIQUE 約束。如果用戶為一個(gè)以上的雇員輸入了同一個(gè)社會(huì)安全號(hào)碼,則會(huì)顯示錯(cuò)誤。
11.SQL里面IN比較快還是EXISTS比較快?
EXISTS比較快因?yàn)镋XISTS返回一個(gè)Boolean型而IN返回一個(gè)值。
12.Oracle中,rowid和rownum有什么不同?
注意 MySQL不支持行號(hào)的使用。
RowId是一個(gè)數(shù)據(jù)庫(kù)內(nèi)部的概念,表示表的一行,用來(lái)快速的訪問(wèn)某行數(shù)據(jù)
Rownum是結(jié)果集的一個(gè)功能, 例如select * from Student where rownum = 2 就是得到結(jié)果集的第二行。
13.delete, truncate 和 drop的區(qū)別?
Delete命令用來(lái)刪除表的全部或者一部分?jǐn)?shù)據(jù)行,執(zhí)行delete之后,用戶需要提交(commmit)或者回滾(rollback) transaction 來(lái)執(zhí)行刪除或者撤銷刪除,?delete命令會(huì)觸發(fā)這個(gè)表上所有的delete觸發(fā)器。
Truncate刪除表中的所有數(shù)據(jù), 這個(gè)操作不能回滾,也不會(huì)觸發(fā)這個(gè)表上的觸發(fā)器,TRUNCATE比delete更快,占用的空間更小。
Drop命令從數(shù)據(jù)庫(kù)中刪除表, 所有的數(shù)據(jù)行,索引和權(quán)限也會(huì)被刪除,所有的DML觸發(fā)器也不會(huì)被觸發(fā),這個(gè)命令也不能回滾。
?
14.MySQL存儲(chǔ)過(guò)程常用的方法有哪些?
創(chuàng)建 MySQL 存儲(chǔ)過(guò)程的簡(jiǎn)單語(yǔ)法為:
| 1 2 3 4 5 6 7 | create procedure 存儲(chǔ)過(guò)程名字() ( [in|out|inout] 參數(shù) datatype ) begin MySQL 語(yǔ)句; end; |
可以使用call來(lái)調(diào)用存儲(chǔ)過(guò)程。
| 1 2 3 4 5 | Java中,類CallableStatement為Java程序提供了一種調(diào)用存儲(chǔ)過(guò)程的方法。CallableStatement對(duì)象可以帶有用于輸入數(shù)據(jù) (IN模式參數(shù)),輸出結(jié)果(OUT模式參數(shù)) 或者用于上面這兩種功能的參數(shù)(IN OUT模式參數(shù))。 下面是在JDBC中調(diào)用存儲(chǔ)過(guò)程的語(yǔ)法。需要注意的是語(yǔ)法中的方括號(hào)只是用于表示可選參數(shù)的,它不是命令語(yǔ)法的一部分。 {call procedure_name([?, ?, ...])} 下面是調(diào)用可以返回結(jié)果參數(shù)值的存儲(chǔ)過(guò)程的語(yǔ)法: {? = call procedure_name([?, ?, ...])} |
15.mysql如何實(shí)現(xiàn)分頁(yè)查詢?
16.建數(shù)據(jù)庫(kù)需要遵循哪些原則?應(yīng)該注意哪些方面?
17.MySQL數(shù)據(jù)庫(kù)有哪些類型的索引?
MySQL主要提供2種方式的索引:B-Tree索引,Hash索引。
B樹(shù)索引具有范圍查找和前綴查找的能力,對(duì)于有N節(jié)點(diǎn)的B樹(shù),檢索一條記錄的復(fù)雜度為O(LogN)。相當(dāng)于二分查找。
哈希索引只能做等于查找,但是無(wú)論多大的Hash表,查找復(fù)雜度都是O(1)。
顯然,如果值的差異性大,并且以等值查找(=、 <、>、in)為主,Hash索引是更高效的選擇,它有O(1)的查找復(fù)雜度。
如果值的差異性相對(duì)較差,并且以范圍查找為主,B樹(shù)是更好的選擇,它支持范圍查找。
18.如何創(chuàng)建索引,什么時(shí)候該創(chuàng)建、什么時(shí)候不應(yīng)該創(chuàng)建?
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 創(chuàng)建索引的標(biāo)準(zhǔn)語(yǔ)法: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空間名; 創(chuàng)建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空間名; 創(chuàng)建組合索引: CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空間名; 創(chuàng)建反向鍵索引: CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空間名; |
?
什么情況下應(yīng)不建或少建索引
表記錄太少
如果一個(gè)表只有5條記錄,采用索引去訪問(wèn)記錄的話,那首先需訪問(wèn)索引表,再通過(guò)索引表訪問(wèn)數(shù)據(jù)表,一般索引表與數(shù)據(jù)表不在同一個(gè)數(shù)據(jù)塊,這種情況下DB至少要往返讀取數(shù)據(jù)塊兩次。而不用索引的情況下DB會(huì)將所有的數(shù)據(jù)一次讀出,處理速度顯然會(huì)比用索引快。
經(jīng)常插入、刪除、修改的表
對(duì)一些經(jīng)常處理的業(yè)務(wù)表應(yīng)在查詢?cè)试S的情況下盡量減少索引。
數(shù)據(jù)重復(fù)且分布平均的表字段
假如一個(gè)表有10萬(wàn)行記錄,有一個(gè)字段A只有T和F兩種值,且每個(gè)值的分布概率大約為50%,那么對(duì)這種表A字段建索引一般不會(huì)提高數(shù)據(jù)庫(kù)的查詢速度。
19.mysql如何實(shí)現(xiàn)分庫(kù)分表,分哪幾個(gè)步驟?
一般情況下,都可以對(duì)主鍵ID取模,做Hash,散列到多個(gè)表中。
比如我要對(duì)User表做分表操作,分散到一百個(gè)表中:
<?php
for(i=0;i=0;i< 100;?i++?){?//echo?"CREATE?TABLE?db2.members{i++?){?//echo?"CREATE?TABLE?db2.members{i} LIKE db1.members<br>";
echo "INSERT INTO members{i}?SELECT?*?FROM?members?WHERE?mid%100={i}?SELECT?*?FROM?members?WHERE?mid%100={i}<br>";
}
?>
?
20.如何實(shí)現(xiàn)范式和反范式?
范式是關(guān)系數(shù)據(jù)庫(kù)理論的基礎(chǔ),也是我們?cè)谠O(shè)計(jì)數(shù)據(jù)庫(kù)結(jié)構(gòu)過(guò)程中所要遵循的規(guī)則和指導(dǎo)方法。
目前關(guān)系數(shù)據(jù)庫(kù)有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,還又稱完美范式)。
各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫(kù)冗余越小。
不滿足范式的模型,就是反范式模型。
反范式跟范式所要求的正好相反,在反范式的設(shè)計(jì)模式,我們可以允許適當(dāng)?shù)臄?shù)據(jù)的冗余,用這個(gè)冗余去取操作數(shù)據(jù)時(shí)間的縮短。本質(zhì)上就是用空間來(lái)?yè)Q取時(shí)間,把數(shù)據(jù)冗余在多個(gè)表中,當(dāng)查詢時(shí)可以減少或者是避免表之間的關(guān)聯(lián);
RDBMS模型設(shè)計(jì)過(guò)程中,常常使用范式約束我們的模型,但在NOSQL模型中則大量采用反范式。
?
21.舉一個(gè)反范式設(shè)計(jì)的例子?
數(shù)據(jù)庫(kù)設(shè)計(jì)要嚴(yán)格遵守范式,這樣設(shè)計(jì)出來(lái)的數(shù)據(jù)庫(kù),雖然思路很清晰,結(jié)構(gòu)也很合理,但是,有的時(shí)候,卻要在一定程度上打破范式設(shè)計(jì)。
這里其實(shí)并不矛盾,因?yàn)榉妒皆礁?#xff0c;設(shè)計(jì)出來(lái)的表可能越多,關(guān)系可能越復(fù)雜,但是性能卻不一定會(huì)很好,因?yàn)楸硪欢?#xff0c;就增加了關(guān)聯(lián)性。特別是在高可用的OLTP數(shù)據(jù)庫(kù)中,這一點(diǎn)表現(xiàn)得很明顯。
最明顯的打破范式的設(shè)計(jì)方法就是冗余法,以空間換取時(shí)間的做法,把數(shù)據(jù)冗余在多個(gè)表中,當(dāng)查詢時(shí)可以減少或者是避免表之間的關(guān)聯(lián)。
還是用上面的例子,學(xué)生表與課程表,假定課程表要經(jīng)常被查詢,而且在查詢中要顯示學(xué)生的姓名,查詢語(yǔ)句則為:
| SQL>select code,name,subject from course c, student s where s.id=c.code where code=? |
這個(gè)語(yǔ)句如果被大范圍、高頻率執(zhí)行,可能會(huì)因?yàn)楸黻P(guān)聯(lián)造成一定程度的影響,現(xiàn)在,假定評(píng)估到學(xué)生改名的需求是非常少的,那么,就可以把學(xué)生姓名冗余到課程表中,又變回了如表所示:
| ID(PK) | 編號(hào) | 姓名 | 選修科目 |
| 1 | 001 | 張三 | 語(yǔ)文 |
| 2 | 001 | 張三 | 數(shù)學(xué) |
| 3 | 001 | 張三 | 英語(yǔ) |
| 4 | 002 | 李四 | 物理 |
| 5 | 002 | 李四 | 化學(xué) |
| 6 | 003 | 王五 | 歷史 |
| 7 | 003 | 王五 | 地理 |
| 8 | 003 | 王五 | 生物 |
注意:我這里并沒(méi)有省略學(xué)生表,不過(guò)是把學(xué)生姓名冗余在了課程表中,如果萬(wàn)一有很少的改名需求,只要保證在課程表中改名正確即可。
那么,修改以后的語(yǔ)句可以簡(jiǎn)化為:
| SQL>select code,name,subject from course c where code=?
? ? |
?
MySQL相關(guān)
1.MySQL的幾種存儲(chǔ)引擎
?
總結(jié)
以上是生活随笔為你收集整理的数据库和MySQL相关面试题目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Selenium实战脚本集(3)--抓取
- 下一篇: mysql-5.6.x半同步复制配置