一.索引
1.索引是什麼
索引是對資料庫中一或多個列值的排序,幫助資料庫高效獲取資料的資料結構
假如我們用模擬的方法,資料庫中的索引就相當於書籍中的目錄一樣,當我們想找到書中的摸個知識點,我們可以直接去目錄中找而不是在書中每頁的找,但是這也丟擲了索引的乙個缺點,在對資料庫修改的時候要修改索引到導致時間變多。
1.2幾個基本的索引型別: 普通索引 、唯一索引、主鍵索引 、全文索引
1.3 索引優點
(1)加快檢索速度; (2)唯一索引確保每行資料的唯一性
(3)在使用索引的過程可以優化隱藏器,提高系統效能
1.4 索引缺點
(1)插入刪除 修改 維護速度下降;(2)占用物理和資料空間
二、 事務
2.1 事務的作用
事務(transaction)是併發控制的基本單位。事務就是一系列的操作,這些操作要麼都執行,要麼都不執行。
2.2 事務具有以下4個基本特徵
· atomic(原子性) 事務中的一系列的操作要麼都完成,要麼全部失敗
·consistency(一致性)乙個成功的事務應該講資料寫入的到資料庫,否則就要回滾到最初的狀態
· isolation(隔離性) 併發訪問和修改的duli
· durability(永續性) 事務結束應該講事務的處理結構儲存起來
2.3 事務的語句
· 開始事物:begin transaction
· 提交事物:commit transaction
· 回滾事務:rollback transaction
三、 資料庫中的樂觀鎖和悲觀鎖
根據不同型別可以對資料設定不同的鎖許可權
樂觀悲觀鎖主要是作用在併發訪問控制
· 悲觀鎖 假定會發生併發衝突,遮蔽任何違反資料完整的操作
· 樂觀鎖 假定不會發生衝突,只有在提交操作時檢查是否違反資料的完整性
五、 主鍵 外來鍵 區別
主鍵: 資料庫中表中唯一和完整標識的資料列或屬性集合。
外來鍵: 在乙個表中存在另外乙個表的主鍵叫做外來鍵
六、資料庫事務的四個特性及含義
資料庫事務transanction正確執行的四個基本要素。acid,原子性(atomicity)、一致性(correspondence)、隔離性(isolation)、永續性(durability)。
(1)原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
(2)一致性:在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
(3)隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,執行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請求,使得在同一時間僅有乙個請求用於同一資料。
(4)永續性:在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。
七、檢視的作用,檢視可以更改麼?
檢視是虛擬的表,與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢;不包含任何列或資料。使用檢視可以簡化複雜的sql操作,隱藏具體的細節,保護資料;檢視建立後,可以使用與表相同的方式利用它們。檢視不能被索引,也不能有關聯的觸發器或預設值,如果檢視本身內有order by 則對檢視再次order by將被覆蓋。
建立檢視:create view *** as ************xx;
對於某些檢視比如未使用聯結子查詢分組聚集函式distinct union等,是可以對其更新的,對檢視的更新將對基表進行更新;但是檢視主要用於簡化檢索,保護資料,並不用於更新,而且大部分檢視都不可以更新。
八、mysql_fetch_row()和mysql_fetch_array()的區別
答:這兩個函式,返回的都是乙個陣列,區別就是第乙個函式返回的陣列是只包含值,我們只能row[0],row[1],這樣以陣列下標來讀取資料,而mysql_fetch_array()返回的陣列既包含第一種,也包含鍵值對的形式,我們可以這樣讀取資料,(假如資料庫的字段是 username,passwd):row[『username『],row[『passwd『。
九、應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,如:select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
(2)下面的查詢也將導致全表掃瞄:
select id from t where name like 『%abc%』
若要提高效率,可以考慮全文檢索。
(3)in 和 not in 也要慎用,否則會導致全表掃瞄,如:
select id from t where num in(1,2,3)
(4)對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
(5)應盡量避免在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
十、應盡量避免在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:
select id from t where substring(name,1,3)=『abc』–name以abc開頭的id
select id from t where datediff(day,createdate,『2005-11-30』)=0–'2005-11-30』生成的id
應改為:
select id from t where name like 『abc%』
select id from t where createdate>=『2005-11-30』 and createdate<『2005-12-1』
十一、不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。
十二、在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。
十四、很多時候用 exists 代替 in 是乙個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
十五、並不是所有索引對查詢都有效,sql是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,sql查詢可能不會去利用索引,如一表中有字段***,male、female幾乎各一半,那麼即使在***上建了索引也對查詢效率起不了作用。
十六、索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
十七、盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長字段儲存空間小,可以節省儲存空間,其次對於查詢來說,在乙個相對較小的字段內搜尋效率顯然要高些。
十八、任何地方都不要使用 select * from t ,用具體的字段列表代替「」,不要返回用不到的任何字段。
十九、如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。
二十、在所有的儲存過程和觸發器的開始處設定 set nocount on ,在結束時設定 set nocount off 。無需在執行儲存過程和觸發器的每個語句後向客戶端傳送 done_in_proc 訊息。
二十一、盡量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理;盡量避免大事務操作,提高系統併發能力。
二十二、select count ()和select count(1)以及select count(column)區別
一般情況下,select count (*)和select count(1)兩著返回結果是一樣的
假如表沒有主鍵(primary key),那麼count(1)比count(*)快,
如果有主鍵的話,那主鍵作為count的條件時候count(主鍵)最快
如果你的表只有乙個字段的話那count(*)就是最快的
count(*) 跟 count(1) 的結果一樣,都包括對null的統計,而count(column) 是不包括null的統計
二十三、索引列上計算引起的索引失效及優化措施以及注意事項
建立索引、優化查詢以便達到更好的查詢優化效果。但實際上,mysql有時並不按我們設計的那樣執行查詢。mysql是根據統計資訊來生成執行計畫的,這就涉及索引及索引的刷選率,表資料量,還有一些額外的因素。
簡而言之,當mysql認為符合條件的記錄在30%以上,它就不會再使用索引,因為mysql認為走索引的代價比不用索引代價大,所以優化器選擇了自己認為代價最小的方式。事實也的確如此是mysql認為記錄是30%以上,而不是實際mysql去查完再決定的。都查完了,還用什麼索引啊?!mysql會先估算,然後決定是否使用索引。
面試題精選 微軟試題
微軟試題 1 直線飛行 一架飛機載滿油飛行距離為1,n架飛機最遠能飛多遠?就是不是兜圈沒有迎頭接應的情況,這問題就是n架飛機能飛多遠?存在的極值問題是不要重複飛行,比如兩架飛機同時給一架飛機加油同 時飛回來即可認為是重複,或者換句話說就是離出發點越遠在飛的飛機 就越少,這個極值條件是顯然的,因為n架...
幾個面試題精選
面試題35 typedef和define有什麼區別 1 用法不同 typedef用來定義一種資料型別的別名,增強程式的可讀性。define主要用來定義常量,以及書寫複雜使用頻繁的巨集。2 執行時間不同 typedef是編譯過程的一部分,有型別檢查的功能。define是巨集定義,是預編譯的部分,其發生...
C 面試題精選
1 執行如下的c 輸出是什麼?class a class b public a int main 答案 輸出b fun with number 10。由於a是乙個指向b例項的引用,因此在執行的時候會呼叫b fun。但預設引數是在編譯期決定的。在編譯的時候,編譯器只知道a是乙個型別a的引用,具體指向什...