1.MYSQL數據庫引擎區別sql
· MyISAM:默認的MySQL插件式存儲引擎,它是在Web、數據倉儲和其餘應用環境下最常使用的存儲引擎之一。注意,經過更改STORAGE_ENGINE配置變量,可以方便地更改MySQL服務器的默認存儲引擎。
· 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引擎,使用事務的話,通常使用InnoDB2.數據庫
2.SQL請寫一段SQL取出數據表中name重複的數據。(注意只須要重複的) 緩存
答:SELECT * FROM member GROUP BY name having count(*)>1;tomcat
3.數據庫索引使用注意安全
數據庫索引是爲了加快查詢速度,可是會下降更新插入刪除的速度;若是每次都要獲取全部表記錄,那麼增長索引意義就不大了;對於大量重複值的字段增長索引也是沒意義的。針對記錄比較少的表增長索引反而會浪費存儲空間,而不會加快速度服務器
4.幾千G的數據怎麼查詢一條記錄比較快網絡
經過增長索引、幾千G數據放一張表不大現實,能夠經過分區,不過度區又會增長查詢難度;併發
5. 數據庫鏈接池原理、好處,tomcat中什麼位置增長?oracle
原理:是在內部對象池中維護必定數量的數據庫鏈接,並對外暴露數據庫鏈接獲取和返回方法。分佈式
好處:對於一個複雜的數據庫應用,頻繁的創建、關閉鏈接,會極大的減低系統的性能,由於對於鏈接的使用成了系統性能的瓶頸。數據庫鏈接池技術帶來的優點:
1)資源重用
2)更快的系統響應速度
3)新的資源分配手段
4)統一的鏈接管理,避免數據庫鏈接泄漏
Tomcat配置位置:在tomcat的context.xml中指定Resource的JNDI名稱;
6.數據庫冷備份和熱備份的不一樣點以及各自的優勢
熱備份針對歸檔模式的數據庫,在數據庫仍舊處於工做狀態時進行備份。而冷備份指在數據庫關閉後,進行備份,適用於全部模式的數據庫。
熱備份的優勢在於當備份時,數據庫仍舊能夠被使用而且能夠將數據庫恢復到任意一個時間點。冷備份的優勢在於它的備份和恢復操做至關簡單,而且因爲冷備份的數據庫能夠工做在非歸檔模式下,數據庫性能會比歸檔模式稍好。
7.MySQL存儲過程和函數有什麼區別?
在本質上它們都是存儲程序。函數只能經過return語句返回單個值或者表對象;而存儲過程 不容許執行return,可是能夠經過out參數返回多個值。函數限制比較多,不能用臨時表,只能用表變量,還有一些函數都不可用等等;而存儲過程的限制相對就比較少。函數能夠嵌入在SQL 語句中使用,能夠在SELECT語句中做爲查詢語句的一個部分調用;而存儲過程通常是做爲一個獨立的部分來執行。
(1)存儲過程當中的代碼能夠改變嗎?
目前,MySQL還不提供對已存在的存儲過程代碼的修改,若是必需要修改存儲過程,必須使用DROP語句刪除以後,再從新編寫代碼,或者建立一個新的存儲過程。
(2)存儲過程當中能夠調用其餘存儲過程嗎?
存儲過程包含用戶定義的SQL語句集合,可使用CALL語句調用存儲過程,固然在存儲 過程當中也可使用CALL語句調用其餘存儲過程,可是不能使用DROP語句刪除其餘存儲過程。
(3)存儲過程的參數不要與數據表中的字段名相同。
在定義存儲過程參數列表時,應注意把參數名與數據庫表中的字段名區別開來,不然將出 現沒法預期的結果。
(4)存儲過程的參數可使用中文嗎?
通常狀況下,可能會出現存儲過程當中傳入中文參數的狀況,例如某個存儲過程根據用戶的 名字查找該用戶的信息,傳入的參數值多是中文。這時須要在定義存儲過程的時候,在後面加 上character set gbk,否則調用存儲過程使用中文參數會出錯,好比定義userInfo存儲過程,代碼 以下:CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)
(5)存儲過程優勢
一、數據庫已經編譯過了,一次性編譯
二、執行速度快
三、能夠重複使用
四、安全性高
一、模塊化、提升程序安全性
二、減小網絡流量
三、提升系統性能、減輕工做站負荷
四、重複執行
存儲過程比直接寫SQL語句執行起來的速度快。
正如你所說的,存儲過程在執行時是會被SQL優化緩存的,而SQL語句則沒有。
8.數據庫事務特色
原子性:要麼全都執行,要麼全都不執行。
一致性:事務在完成時,必須使全部的數據都保持一致狀態。
隔離性:由併發事務所做的修改必須與任何其它併發事務所做的修改隔離。
持久性:事務完成以後,它對於系統的影響是永久性的。
9.數據庫三大範式
範式一:每一字段只存儲一個值
範式二:必須先符合範式一的條件,且每一行都能被惟一的識別。將範式一轉換成範式二的方法是添加主鍵。
範式三:沒有一個非關鍵屬性依賴於另外一個非關鍵屬性。
10.數據庫鎖機制
1).數據庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其餘的事務不能對它讀取和修改。加了共享鎖的數據對象能夠被其餘事務讀取,但不能修改。
2).悲觀封鎖、樂觀封鎖和死鎖
悲觀封鎖:
鎖在用戶修改以前就發揮做用:
Select ..for update(nowait)
Select * from tab1 for update
用戶發出這條命令以後,oracle將會對返回集中的數據創建行級封鎖,以防止其餘用戶的修改。
若是此時其餘用戶對上面返回結果集的數據進行dml或ddl操做都會返回一個錯誤信息或發生阻塞。
樂觀封鎖
樂觀的認爲數據在select出來到update進取並提交的這段時間數據不會被更改。這裏面有一種潛在的危險就是因爲被選出的結果集並無被鎖定,是存在一種可能被其餘用戶更改的可能。所以Oracle仍然建議是用悲觀封鎖,由於這樣會更安全。
死鎖
當兩個用戶但願持有對方的資源時就會發生死鎖.
即兩個用戶互相等待對方釋放資源時,oracle認定爲產生了死鎖,在這種狀況下,將以犧牲一個用戶做爲代價,另外一個用戶繼續執行,犧牲的用戶的事務將回滾。
11.甚麼時候會出現事務回滾,而甚麼時候不會出現事務回滾?如何設計事務回滾。
能夠在拋出異常的時候加入事務回滾方法;若數據庫不支持回滾,可給記錄行設定狀態序號和歷史狀態序號,更新前先設定狀態序號,若是成功了就把這個狀態序號設成歷史序號以表示提交,若是失敗了就把原始數據給恢復過來以回滾。
12.Orcale如何實現查詢出來的空值變成0?
答:真的要是把空值用0表示的話,oracle中有nvl函數
select nvl(columnName,0) from table
意思就是把columnName字段爲空的顯示成0,固然也能夠顯示成任何字符或者數字
13.Orcale如何實現查詢出來的兩個字段放在一個位置上?
答:oracle數據庫
select A || ':' || B from t
前提是A B字段都是字符型,假如不是,就用to_char()方法轉換成字符型
14.觸發器的具體含義和用法
觸發器是編寫的一段SQL語句,其關鍵字是TRIGGER(觸發器的意思),它附着於指定的表,做用主要在於監控其附着的表在產生特定動做時應作的SQL處理,使用觸發器的好處在於大大簡化了相關表的維護,將數據一致性問題交由數據庫後臺處理。
在使用觸發器的時候須要注意,對於相同的表,相同的事件只能建立一個觸發器,好比對 表account建立了一個BEFORE INSERT觸發器,那麼若是對錶account再次建立一個BEFORE INSERT觸發器,MySQL將會報錯,此時,只能夠在表account上建立AFTER INSERT或者 BEFORE UPDATE類型的觸發器。靈活的運用觸發器將爲操做省去不少麻煩。
觸發器定義以後,每次執行觸發事件,都會激活觸發器並執行觸發器中的語句。若是需求 發生變化,而觸發器沒有進行相應的改變或者刪除,則觸發器仍然會執行舊的語句,從而會影響 新的數據的完整性。所以,要將再也不使用的觸發器及時刪除。
15.對內外鏈接的理解?
(1)、內鏈接:select * from a inner join b on a.id = b.id;
只顯示a.id與b.id相同的行,左邊顯示a表的字段,右邊顯示b表的字段;
(2)、左外鏈接:select * from a left join b on a.id = b.id;
左邊顯示a表的字段並顯示全部數據,右邊顯示b表的字段,只顯示a.id與b.id相同的行,其餘用null補充;
(3)、右外鏈接:select * from a right join b on a.id=b.id;
右邊顯示b表的字段並顯示全部數據,左邊顯示a表的字段,只顯示a.id與b.id相同的行,其餘用null補充;
(4)、徹底外鏈接:select * from a full join b on a.id=b.id;
左邊顯示a表字段,右邊顯示b表的字段;其中a.id與b.id相同的行全顯示,a.id與b.id不一樣的行,在a表中有數據的行在b中用null填充,在b表中有數據的行在a表中用null填充;
(5)、交叉鏈接:select * from a cross join b;
返回的行數是左邊與右邊行數的乘積;
16.Statement,PreparedStatement,CallableStatement區別
1).PreparedStatement是預編譯的,並支持批處理,對於批量處理能夠大大提升效率. 也叫JDBC存儲過程;能夠傳參數,在獲得PreparedStatement對象時肯定sql.
2).使用 Statement 對象。在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理。
statement用於執行靜態 SQL 語句並返回它所生成結果的對象,在執行時肯定sql。
3).CallableStatement用於執行 SQL 存儲過程的接口。若是有輸出參數要註冊說明是輸出參數。
17.是否是索引創建得越多越好?
合理的索引能夠提升查詢的速度,但不是索引越多越好。在執行插入語句的時候,MySQL 要爲新插入的記錄創建索引。因此過多的索引會致使插入操做變慢。原則上是隻有查詢用的字段 才創建索引。
查詢緩衝區能夠提升查詢的速度,可是這種方式只適合查詢語句比較多、更新語句比較少 的狀況。默認狀況下查詢緩衝區的大小爲〇,也就是不可用。能夠修改queiy_cache_size以調整 查詢緩衝區大小;修改query_cache_type以調整查詢緩衝區的類型。在my.ini中修改 query_cache_size 和 query_cache_type 的值