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