《高效能MySQL》讀書筆記
第一章 MySQL架構與歷史
MySQL 伺服器邏輯架構圖
- 最上層服務:大多數基於網路的服務都有類似最上層的架構
- 第二層架構:包含大多數MySQL的核心服務功能,包括查詢解析、分析、優化、快取以及所有的內建函式(日期、時間、數學、加密函式等),所有跨儲存引擎的功能都在在一層時間:儲存過程、觸發器、檢視等。
- 第三層:包含儲存引擎。儲存引擎負責 MySQL 中資料的儲存與提取。
連線管理與安全性。
- 每個客戶端連線會在伺服器程序中擁有一個執行緒,這個連結的查詢只會在這個單獨的執行緒中執行,該縣城只能輪流咋某個CPU核心或者CPU中執行。伺服器會負責快取執行緒,因此不需要為每一個新建的連線建立或者銷燬執行緒。
- 客戶端連結到MySQL伺服器時,伺服器需要對其進行認證。認證基於使用者名稱、原始主機資訊和密碼。如果使用SSL方式連線,還可以使用X.509證書認證。一旦客戶端連線成功,伺服器會繼續驗證該客戶端時候具有執行某個特定查詢的許可權(例如是否允許客戶端對world資料庫的Country表執行SELECT語句)。
優化與執行。
- MySQL 會解析查詢,並建立內部資料結構(解析樹),然後對其進行各種優化,包括重寫查詢、決定表的讀取順序,以及選擇合適的索引等。使用者可以通過特殊的關鍵字提示(hint)優化器,影響他的決策過程。也可以請求優化器解釋優化過程的各個因素,使得使用者可以知道伺服器是如何進行優化決策的,並提供一個參考基準,便於使用者重構查詢和schema、修改相關配置,使應用盡可能高效執行。
- 對於SELECT語句,在解析查詢之前,伺服器會先檢查查詢快取(Query Cache),如果能夠在其中找到對應的查詢,伺服器就不必再執行查詢解析、優化和執行的整個過程,而是直接返回查詢快取中的結果集。
併發控制。
多個查詢需要在同一時刻修改資料都會產生併發控制的問題。本章討論兩個層面的併發控制:伺服器層 與 儲存引擎層。- 讀鎖(read lock):共享的,互不阻塞的。多個客戶在同一時刻可以讀取同一個資源,互不干擾。
- 寫鎖(write lock):排他的,一個寫鎖會阻塞其他的寫鎖和讀鎖,處於安全策略的考慮。
在實際的資料庫系統中,每時每刻都在發生鎖定,當某個使用者在修改某一部分資料時,MySQL 會通過鎖定防止其他使用者讀取同一資料。大多數時候,MySQL 鎖內部管理對外不可見。
鎖粒度。
表鎖(table lock)。開銷最小。鎖定整張表。表鎖在特定場景有良好效能,如READ LOCAL 表鎖支援某些型別的併發寫操作。另外寫鎖比讀鎖有更高的優先順序,寫鎖請求會被插到讀鎖佇列的前面(讀鎖不會)。儲存引擎可以管理自己的所,但MySQL 本身還是會使用各種有效的表鎖來實現不同的目的,如伺服器會為諸如ALTER TABLE之類的語句使用表鎖。
行級所(row lock)。最大程度支援併發處理,最大鎖開銷。InnoDB 和 XtraDB,以及其他一些儲存引擎中實現行級鎖。行級鎖只在儲存引擎層實現,而MySQL在伺服器層沒有實現。伺服器層不瞭解儲存引擎中的鎖實現。
事務。
- 原子性
- 一致性
- 隔離性
- 永續性
隔離級別。
SQL 標準中定義了四種隔離級別,每一種級別都規定了一個事務中所做的修改,哪些在事務內和事務間是可見的,哪些是不可見的。較低級別的併發通常可以執行更高的併發,系統的開銷也更低。
四種隔離級別
READ UNCOMMITTED(未提交讀)。
事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,稱髒讀(Dirty Read)。該隔離級別一般少用。
READ COMMITTED(提交讀)。
是大多數資料庫預設隔離級別,但MySQL不是。換句話說,一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。該級別也稱不可重複讀(nonrepeatable read),因為兩次執行同樣的查詢,可能得到不一樣的結果。
解決了髒讀的問題。該級別保證了在同一個事務中無法多次都去同樣的記錄的結果是一致的。
相關推薦
高效能mysql讀書筆記(一)
1 mysql的架構與歷史: 1.1 mysql邏輯架構 mysql將查詢等處理與資料儲存相分離的,可以更加靈活的選取資料儲存的方式。mysql處理架構:連線處理->解析器->查詢快取->優化器->儲存引擎。 第一層:連線處理:包括主要的授權登入、安
高效能MySQL.讀書筆記(六)高可用性
什麼是高可用性 每個應用對可用性的需求各不相同。在設定一個可用時間的目標之前,先問問自己,是不是確實需要達到這個目標。可用性每提高一點,所花費的成本都會遠超之前;可用性的效果和開銷的比例並不是線性的。需要保證多少可用時間,取決於能夠承擔多少成本。高可用性實際上是在宕機造成的
高效能MySQL.讀書筆記(一)優化伺服器設定
MySQL有大量可以修改的引數——但不應該隨便去修改。通常只需要把基本的配置項配置正確(大部分情況下只有很少一些引數是真正重要的),應該將更多的時間花在schema的優化、索引,以及查詢設計上。 確保基本的配置是正確的,如果碰到了問題,並且問題是由於伺服器的某部分導致的,而這恰好可以通過某個配置項解決,那麼需
高效能mysql讀書筆記(四)
四,建立高效能的索引 索引也稱為鍵,索引是一種查詢資料有用的資料結構,索引優化是查詢優化中最優效的手段。 索引可以包含一列或者多列,mysql能夠高效的使用索引中的最左字首列,索引在儲存引擎層實現,不同的儲存引擎有不同的索引。B-tree索引作為大多數資料庫的索引資料結構,
高效能MySQL.讀書筆記(二)作業系統和硬體優化
使用Flashcache 雖然有很多因素需要在快閃記憶體、硬碟和RAM之間權衡,在儲存層次結構中,這些裝置沒有被當作一個整體處理。有時可以使用磁碟和記憶體技術的結合,這就是Flashcache。 Flashcache是一個Linux核心模組,使用Linux的裝置對映器(Device Mapper)。它在記憶體
學習《高效能MySQL》筆記-索引篇
1.索引釋義: 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。如果想按特定職員的姓來查詢他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取資訊。比如書本的目錄,那幾頁目錄就是索引內容,目錄中的維度比如“章節名稱”、“首字母”對應的就
《高效能MySQL》筆記——MySQL建表資料型別的選擇
前段時間看了《高效能MySQL》中的選擇優化的資料型別,這裡主要是做一下筆記。 首先資料選擇有幾個簡單原則: 更小的通常更好。一般情況下,應該儘量使用可以正確儲存資料的最小資料型別。例如只需要存 0~200,tinyint unsigned 更好。更小的資料型別通常更快,因為它們佔
高效能MySQL 個人筆記
# 寫作目的 最近讀了《高效能MySQL_第3版(中文)》決定寫一篇專門的部落格來記錄所學所得,以及記錄自己平時的積累經驗,並傳播給大家。 # 儲存引擎 ## MyISAM 單獨存放行數資訊(count(*)不帶篩選條件時不用讀表); 支援表鎖,不支援行鎖; 不支援
高效能 JavaScript 讀書筆記(四)
迴圈 1.減少迭代的工作量 2.倒序迴圈 條件語句 if-else && switch 大多數情況下,switch 比 if-else 執行的快。但只有條件數量很大的時候才明顯。 優化 if-else 1.把最可能出現的條件放在最前面。 2.巢
高效能javascript讀書筆記之操作DOM
DOM:文件物件模型,是一個獨立於語言的,用來操作XML和HTML文件的程式介面(API)。 瀏覽器通常會把DOM和javascript獨立實現,每次連線DOM和ECMAScript,都會被收取“過橋費”(效能消耗)。 優化方法: 1.減少訪問DOM的次數,把運算儘量留在
高效能MySql閱讀筆記-第一章
1.Mysql的邏輯架構 解釋: ①第一層客戶端:這個不是Mysql特有,譬如Navicat等客戶端工具。 ②第二層Mysql核心服務功能:譬如查詢解析,優化,快取處理,以及內建函式,儲存過程,檢視
高效能javascript讀書筆記之注意點
1.避免雙重求值 允許傳人另一段javascript程式碼字串並執行的四種方法: eval()、Function()建構函式、setTimeout()和setInterval() 當在javascript程式碼中執行另一段javascript程
編寫高效能JavaScript (讀書筆記)
轉載自http://kb.cnblogs.com/page/501177/ 作者: Addy Osmani 讀書筆記: 作者以V8為例講解: 一.核心構成部分 二.垃圾回收GC:Garbage Collecation 更喜歡叫做資源回收。 Q1:在JavaScript
高效能 JavaScript 讀書筆記(五)
字串和正則表示式 字串連線 連線字串有很多方式,常見的有: 1.str = "a" + "b" + "c"; 2.str = "a"; str += "b"; str += "c"; 3.str = ["a","b","c"].join(""); 4.str = "
高效能 JavaScript 讀書筆記(三)
重繪與重排 概念 重排:當元素的寬和高發生改變的時候,就會重新排列元素,稱為重拍。 重繪:將重排的的元素重新繪製在瀏覽器中,稱為重繪。 在元素中新增段落、新增邊框、新增或者刪除元素、修改內外邊距等,一切改變現有元素的位置的操作都會導致重排的發生。相應的,新增背景色這一類沒有改變元素位
高效能 JavaScript 讀書筆記 (二)
資料存取 字面量、本地變數、陣列元素、物件成員 字面量只代表自身,不儲存在特定的位置。JavaScript 中的字面量有:字串、數字、布林值、物件、陣列、函式、正則表示式以及特殊的 null 和 undefined 值。 一般來說,訪問本地變數和字面量的事件較少,訪問陣列元素和物件成員花
《高效能MySQL》筆記-列舉(ENUM)型別
有時候可以使用列舉列代替常用的字串型別。列舉列可以把一些不重複的字串儲存成一個預定義的集合。MySQL在儲存列舉時非常緊湊,會根據列表值的數量壓縮到一個或者兩個位元組中。MySQL在內部會將每個值在列表中的位置儲存為整數,並且在表的.frm檔案中儲存“數字-字串
高效能MySQL學習筆記(1) —— MySQL架構
MySQL架構 1.MySQL邏輯架構: 這裡分為三層: 1.連線層:連線與執行緒處理,這一層並不是MySQL獨有,一般的基於C/S架構的都有類似元件,比如連線處理、授權認證、安全等。 2.SQL處理層:也叫MySQL伺服器層,包括快取查詢、解析
高效能MySql學習筆記——鎖、事務、隔離級別
為什麼需要鎖? 因為資料庫要解決併發控制問題。在同一時刻,可能會有多個客戶端對Table1.rown進行操作,比如有的在讀取該行資料,其他的嘗試去刪除它。為了保證資料的一致性,資料庫就要對這種併發操作進行控制,因此就有了鎖的概念。 鎖的分類 從對資料操作的型別(讀\
《高效能MySQL》筆記-索引
什麼是索引,為什麼要使用索引 資料庫的索引,就像一本字典的索引一樣,可以讓你快速定位到你想尋找的地方。 索引可以大大加快查詢的速度。想想一下,如果一本字典沒有索引,想查一個東西只能從頭到尾“遍歷”整本字典,十分不方便。 雖然索引可以加快查詢速度。但是索引也