經過挺長時間的自我探索和學習,我看了好多的東西,書籍?博文?或者是一些技術部落格上面的問答,但是由於能了解的東西還真的是不少,導致我總會忘記一些東西,所以我先簡單寫一點然後隨著看隨著進行記錄。
可以看到裡面的東西除了外部的客戶端訪問,其餘的已經體現出來,裡面基本分為了兩個部分,底層是儲存引擎,上層則是一些優化器,解析器的東西。
在讀資料方面一般分為共享鎖,已經排他鎖,不過,排他鎖主要還是以寫資料時為主,而鎖大體比較常常提到的也是兩個,乙個是表鎖,另乙個則是行鎖,行級別的鎖一般在儲存引擎層面就已經實現,另乙個就是表鎖了,在邏輯層就已經賦予。
談到鎖就可能涉及一些和粒度有關的問題,合理的粒度分配能夠提高資料庫在查詢作業方面的效能,通常來說鎖越少,併發效能也就變得越高,將粒度控制在乙個相對準確的範圍內準確的利用行級別的鎖可以有效的改善併發效率,而資料庫引擎的行級鎖可以被覆蓋,舉個例子:alter table 這是乙個sql語句,非常的常用,它這個語句執行之時執行的就是表鎖,說明這個語句將行級鎖在底層的實現給覆蓋掉了。
有關事務方面,乙個原子性的sql查詢,要麼全部成功,要麼全部失敗,這只是乙個感念。
使用start transcation 開啟事務,要麼commit,要麼rollback,整體進行返回。事務本身消耗大量的資源。
下面可能提及一些比較細節的問題,回顧一下概念,acid ,這個概念應該相當的簡單,就是原子性,一致性,隔離性,永續性。
事務的幾種級別:
1.readuncommit:未提交可讀:髒讀現象頻繁,基本不會有什麼系統採納這種方案
2.read commit:提交可讀,即提交改動後才會真正讓別人看見,但是不能重複讀取。否則會出現不一致,大多數預設
3.repeatable:可重複讀。幻讀的問題出現。
4serializable:序列化,不用太細緻說明也明白。這個在專案中使用有可能讓任務排隊到天荒地老。
mysql中的事務儲存引擎熟知的有兩個,乙個是innodb,乙個是ndbcluster.
基本都是預設使用自動提交的方式;
然後為簡單解釋一下集中隔離級別出現現象的形象解釋,避免錯誤理解:
1.髒讀:簡單來說有人在寫入a和b,結果它剛寫完a,你這邊就讀,而且你比他快,你一下都讀完了,那麼你了解的就是新的a 和舊的b,這樣的資料是沒有價值的。在readuncommit的事務情況下經常出現,當然一般沒人用這種級別的事務。
2.不可重複讀:就是假設你訪問乙個資料在乙個事務中訪問兩次,而在此期間出現了另乙個事務,對資料修改,很快完成了,那麼你這兩次的訪問把修改的情況夾在中間,使得兩次結果不同。
3幻讀:就是當兩個事務,乙個是插入,乙個是修改,修改過程中插入了新的,這就讓看的覺得怎麼沒全部修改,實際是因為,修改過的地方被插入了資料。
啊,最後在簡單聊聊正規化吧,嗯,多麼久遠基礎的知識,上研究生以後都沒再看過了。
1nf: 典型的原子性,列不可再分:這是建立表的基本要求。
2nf:就是消除部分依賴,也比較常見,乙個表有那麼幾個重要的決定全域性的就夠了,別出現部分傳遞性的依賴,出現就再拆乙個表。
3nf:要求較高,在1nf 和2nf的基礎上,表中不可再出現其他表中的非主屬性值
bcnf:要求更特別:即使是碼中也不要喲傳遞或者部分依賴。
順帶說一下,sql中or這個指令實際遠不如in,原因也是因為in在底層的實現是二叉樹查詢o(logn)級別的複雜度,好了,嘮叨完成,想必這麼長的嘮叨也很少有人看,如果有的話可以交流一下資料庫調優方面的事情。
mysql資料庫小結
adrian default character set utf8 collate utf8 general ci comment x default character set utf8 資料庫字符集。設定資料庫的預設編碼為utf8,utf8中間不要 collate utf8 general ci...
MySQL資料庫小結
一 mysql是最流行的關係型資料庫管理系統 1 資料以 的形式出現 每乙個表的名字應具有唯一性 2 每行為各種記錄名稱 3 每列為記錄名稱所對應的資料域 4 許多的行和列組成一張表單 5 若干的表單組成database 二 四大類別 資料定義語言 ddl data definition langu...
MYSQL資料庫使用小結
由於專案的需要,新開發一套系統需要用到mysql資料庫.之前我沒有碰過mysql資料庫,經過一段時間的摸索和網上查詢資料 終於把專案做完.現在把有相關的資料總結一下,方便以後使用查詢.mysql版本的介紹 分為安裝版和免安裝版 個人認為 兩者的區別在於 安裝版在安裝時會幫你配置好,免安裝需要自己手工...