oracle 大量資料加索引 資料庫相關知識

2021-10-12 20:30:48 字數 3847 閱讀 2419

資料庫是學計算機比不可少的一門課程。最長常見的資料庫是mysql和oracle,現在大的網際網路公司都是用的mysql,像銀行系統或者做安全的公司大都是用的oracle。

現在我們就以下5點來逐步了解下mysql吧

1、mysql儲存引擎有哪幾種

2、mysql事務

3、mysql鎖

4、mysql分庫分表

5、mysql索引優化

1、mysql儲存引擎有哪幾種

一、innodb

這是mysql 5.5或更高版本的預設儲存引擎。它提供了事務安全(acid相容)表,支援外來鍵引用完整性約束。它支援提交、回滾和緊急恢復功能來保護資料。它還支援行級鎖定。
二、myisam

該儲存引擎管理非事務性表,提供高速儲存和檢索,支援全文搜尋。
myisam和innodb的區別

1. myisam不支援事務,innodb支援事務

2. myisam不支援外來鍵,innodb支援外來鍵

3. myisam只支援表鎖,不支援高併發,innodb支援表鎖和行鎖(共享鎖、排它鎖、意向鎖)

4. 大量select操作,最好選擇myisam,執行大量insert update 最好選擇innodb

5. myisam是非聚集索引,索引和資料分開,只快取索引;innodb是聚集索引,索引和資料存在乙個檔案。

2、mysql事務首先要了解事務的概念:事務是一組sql語句組成的邏輯單元,要不全部執行,要不全部不執行。

事務的特性:acid

atomicity 原子性:一組sql要不全部執行,要不全不執行,重點在單個事務本身

consistency:資料庫的完整性約束沒有被破壞,事務執行的前後都是合法的資料狀態

isolation:併發執行的各個事務之間不能互相干擾。

durability:事務一但提交,它對資料庫的改變是永久性的。其他操作或故障不應該對其有影響。重點在單個事務本身

1.資料庫什麼時候會有事務出現?

show variables like '%engine%'; 使用的儲存引擎

select version(); 資料庫版本

show global variables like 'tx_isolation';使用的隔離機制

針對增刪改操作自動提交

set session autocommit=off;

關閉自動提交事務後快取中的資料不會寫入磁碟,必須使用commit/rollback提交事務

------------------下面討論寫操作對讀操作的影響------------------------

事務併發的三大問題:髒讀、不可重複讀、幻讀

(1)事務併發的三大問題髒讀:

事務a讀到了事務b未提交的資料(髒資料)

舉例如下

(2)事務併發的三大問題 不可重複讀:在事務a中先後兩次讀取同乙個資料,兩次讀取的結果不一樣,這種現象稱為不可重複讀。髒讀與不可重複讀的區別在於:前者讀到的是其他事務未提交的資料,後者讀到的是其他事務已提交的資料。舉例如下:

(3)事務併發的三大問題 幻讀:在事務a中按照某個條件先後兩次查詢資料庫,兩次查詢結果的條數不同,這種現象稱為幻讀。不可重複讀與幻讀的區別可以通俗的理解為:前者是資料變了,後者是資料的行數變了。舉例如下:

事務併發的三大問題其實都是讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決

資料庫實現事務隔離的方式,基本上可分為以下兩種。

· 一種是在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。

· 另一種是不用加任何鎖,通過一定機制生成乙個資料請求時間點的一致性資料快照(snapshot),並用這個快照來提供一定級別(語句級或事務級)的一致性讀取。

3、鎖機制

首先來看兩個事務的寫操作之間的相互影響。隔離性要求同一時刻只能有乙個事務對資料進行寫操作,innodb通過鎖機制來保證這一點。

鎖機制的基本原理可以概括為:

事務在修改資料之前,需要先獲得相應的鎖

獲得鎖之後,事務便可以修改資料

該事務操作期間,這部分資料是鎖定的,其他事務如果需要修改資料,需要等待當前事務提交或回滾後釋放鎖。

innodb的鎖分為行鎖(排它鎖、共享鎖)、表鎖

表鎖

表級鎖是mysql最大粒度的鎖定機制。特點是:實現邏輯非常簡單,帶來的系統負面影響最小。獲取鎖和釋放鎖很快。可以避免死鎖。

表鎖分為表共享讀鎖和表共享寫鎖,讀鎖不會阻塞其他使用者對同一表的讀請求,會阻塞對同一表的寫請求,寫鎖會阻塞其他使用者對同一表的任意請求。

行鎖

行鎖顧名思義就是在一行上加鎖,鎖定粒度小,帶來的負面影響最小。可能會死鎖。行鎖的型別很多,共享鎖、排他鎖、行鎖使用不當會變成表鎖。

4、索引

innodb是聚集索引,也就是索引資料存在同乙個檔案裡面。當顯示設定乙個字段為主鍵時,有主鍵索引,沒有顯示設定時,innodb會預設給乙個唯一標識資料記錄的列為主鍵,如果不存在,自動為innodb生成乙個隱含字段作為主鍵。

概念:索引是一種排好序的資料結構,這就是為什麼索引可以提高查詢速度。

索引的種類:

主鍵索引

唯一索引

復合索引

聚簇索引

非聚簇索引

全文索引

索引是可以提高查詢速度的,大部分人想我只要給表加了索引那麼查詢效率肯定提高,事實不是這樣的,索引列你選對了嗎,雖然索引加上了,可是你的查詢條件不對也會導致索引失效的。你可能會驚訝索引怎麼還會失效的。帶著這些問題,我們來探索下索引的那些事情,讓你更直觀的認識索引。

先來了解下 索引應該加在哪些欄位上呢?

1、具有唯一標識的;

2、長度不能太長的,建在小字段上

3、索引應該建在查詢高的字段上

4、表的主外來鍵必須有索引

5、頻繁進行操作的表,不建議建立太多的索引

6、資料量大的表應該建立索引

聚簇索引指的是索引和資料都存在一張表上,並且由於innodb採用多叉平衡數,三層樹結構就可以儲存2000多萬的索引,所以採用數的結構可以減少遍歷的層數,快速查詢對應的資料。

復合索引(a,b,c,d) 什麼樣的操作使用了索引,什麼樣的操作沒有使用索引,索引的查詢遵循什麼原則?如何檢視一條sql語句用到哪種型別的索引?排序和group by會產生臨時記憶體嗎?如何優化查詢語句,select * 合適嗎?

select * from test where name='a'; 使用了索引a

Oracle 插入大量資料

2.假如tab1表中的沒有資料的話 drop table tab1 create table tab1 as select from tab2 然後在建立索引 3.用hint 提示減少操作時間 4.採用不寫日誌及使用hint提示減少資料操作的時間。建議方案是先修改表為不寫日誌 sql alter t...

Oracle 插入大量資料

2.假如tab1表中的沒有資料的話 drop table tab1 create table tab1 as select from tab2 然後在建立索引 3.用hint 提示減少操作時間 4.採用不寫日誌及使用hint提示減少資料操作的時間。建議方案是先修改表為不寫日誌 sql alter t...

Oracle 插入大量資料

2.假如tab1表中的沒有資料的話 drop table tab1 create table tab1 as select from tab2 然後在建立索引 3.用hint 提示減少操作時間 4.採用不寫日誌及使用hint提示減少資料操作的時間。建議方案是先修改表為不寫日誌 sql alter t...