雖然這些資料都存在於乙個user表中,但是物理上,這些資料可能儲存在分散的資料塊中。
查詢lily這個人的資訊, 已知lily的identity為2, select * fromuser where identity= 2.
在查詢的時候,首先找到這個表的第一條記錄所在的資料庫位址,然後發現identity為1,並不是所需要的值,然後在這個資料庫的底端,找到了下乙個資料塊的位址。(這個類似於鍊錶),如此一來,查詢了5次才找到了所需要的值。(為了簡單起見,我們考慮identity不能有重複值)
為了加快搜尋速度,這裡就出現了索引。索引是對某個字段進行排序的一種方式。對錶中的某個字段建立索引會建立另一種資料結構,其中儲存著字段的值,每個值又指向與它相關的記錄。這種索引的資料結構是經過排序的,因而可以對其執行二分查詢。
對上個表的identity欄位進行索引,就是在資料庫儲存空間上建立一塊專用的控制項,把user表的所有的identity欄位的值拿出來放到這裡,並且對這些值進行排序,並且每個值都攜帶著這個identity對應的行所在資料塊的位址。因為identity是進過排序的,按照一定的資料結構儲存的,所以資料庫引擎在查詢的時候,比如說查詢identity為5,引擎就會計算,5大概在整個排序結構的大致地方,然後到那裡去拿出這個值看看是不是,不是的話就再次相應的向左或者向右移動去尋找。(這裡用到的知識都是大學時候的資料結構的知識,二分法查詢,相對於毫無頭緒的乙個乙個的查詢,二分法的查詢速度明顯的提高,達到了log2 n,其實這有多快我也不明白,反正就記得當時學的時候,確實是比一般查詢快多了。)
通俗的來講,就是根據你指定的列,建立乙個遵循一定資料結構的區域,這些區域可以快速定位到相應資料庫字段所在的磁碟位址。
索引的好處是特別明顯的,那就是大大的提高了查詢的速度。但是相對應的也帶來了一些不好的地方。
第一,建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
第二,索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
最後還有一點需要注意的是,我們在資料庫上對於某個字段建立了索引,那麼什麼情況下才走索引呢?
比如 select * from user where identity= 2 這條語句,是走索引查詢的。因為是否走索引取決於這條查詢語句的where子句。資料庫引擎發現你的where語句中有identity,那麼就會從identity的索引資料結構中進行檢索。曾經看到有人說select *會降低檢索速度,這個跟索引沒關係,select * 降低檢索速度,是因為從資料庫伺服器端到客戶端的網路傳輸是有時間的,select * 中難免包含著不必要的字段,所以傳輸起來會比較慢。
接下來單純的比較一下select * 與select 單個欄位在速度上的區別。如果資料量非常非常大的話,這種速度上的差別是非常明顯的。下邊這個例子,是從相同的資料庫表中去拿資料。
當只是返回乙個out_id欄位的時候,你可以看到49秒鐘的時候就處理了30萬條資料。
這時候我們使用select * 這種方式,我們發現,在用事一分鐘的時候,才處理了3萬條資料。
從上邊的對比中我們可以看出,在資料量非常大而且資料表字段非常多的時候,這兩種方式在檢索時間上的差別還是非常大的。
**:
資料庫索引的理解
索引 這個名字,想必大家都耳熟能詳了,眾所周知,索引最大的用途就是提公升資料庫的查詢速度。或許,你會說,我曾經自己動手按書上講的方法試驗了一番,可是沒有感覺有多大速度的提公升呢?這完全是可能的,因為索引就像是一門非常厲害的武功招式,如果我們想發揮其最大的功力,光憑招式的純熟是遠遠不夠的,我們還必須同...
資料庫的事物隔離級別通俗理解
總的說,資料庫事物無非就兩種 讀取事物 select 修改事物 update,insert 在沒有事物隔離控制的時候,這兩種事物的排列,a22,就有四種有序的併發事物可能性 更新時又乙個更新,更新時來了乙個讀取的,讀取時來了乙個更新的,讀取時來了乙個插入的,最後一種有點不大一樣 這樣多個事物在同一時...
資料庫事物隔離級別通俗理解
總的說,資料庫事物無非就兩種 讀取事物 select 修改事物 update,insert 在沒有事物隔離控制的時候,多個事物在同一時刻對同一 資料的操作可能就會影響到最終期望的結果,通常有四種情況 1 兩個更新事物同時修改一條資料時,很顯然這種情況是最嚴重的了,程式中無論如何也不能出現這種情況,因...