MySQL主從熱備份工作原理
簡單的說:就是主服務器上執行過的sql語句會保存在binLog里面,別的從服務器把他同步過來,然后重復執行一遍,那么它們就能一直同步啦。
整體上來說,復制有3個步驟:
作為主服務器的Master,會把自己的每一次改動(每條sql語句)都記錄到二進制日志Binarylog中。
作為從服務器Slave, 會用master上的賬號登陸到 master上,讀取master的Binarylog,寫入到自己的中繼日志 Relaylog。
然后從服務器自己的sql線程會負責讀取這個中繼日志,并執行一遍。
MySQL索引的作用與數據結構
DB在執行一條Sql語句的時候,默認的方式是根據搜索條件進行全表掃描,遇到匹配條件的就加入搜索結果集合。如果我們添加索引的話,首先去索引列表中查詢,而我們的索引列表是B類樹的數據結構,查詢的時間復雜度為O(log2N),定位到特定值得行就會非常快,所以其查詢速度就會非常快。
Mysql索引使用的數據結構主要有BTree索引 和 哈希索引 。對于哈希索引來說,底層的數據結構就是哈希表,因此在絕大多數需求為單條記錄查詢的時候,可以選擇哈希索引,查詢性能最快;其余大部分場景,建議選擇BTree索引。
Mysql的BTree索引使用的是B數中的B+Tree(https://mp.weixin.qq.com/s/jRZMMONW3QP43dsDKIV9VQ),B+tree的優點為B+tree的磁盤讀寫代價更低,B+tree的查詢效率更加穩定
MySQL 常見的兩種存儲引擎MyISAM與InnoDB的理解
關于二者的對比與總結:
兩種存儲引擎MyISAM與InnoDB的實現方式的不同:
1.主索引的區別:InnoDB的數據文件本身就是索引文件。而MyISAM的索引和數據是分開的。
2.輔助索引的區別:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。
MyISAM: B+Tree葉節點的data域存放的是數據記錄的地址,索引文件和數據文件是分離的。在索引檢索的時候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其 data 域的值,然后以 data 域的值為地址讀取相應的數據記錄。這被稱為“非聚簇索引”。
InnoDB: 其數據文件本身就是索引文件。相比MyISAM,索引文件和數據文件是分離的,其表數據文件本身就是按B+Tree組織的一個索引結構,樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。這被稱為“聚簇索引(或聚集索引)”。而其余的索引都作為輔助索引(非聚集索引),輔助索引的data域存儲相應記錄主鍵的值而不是地址,這也是和MyISAM不同的地方。在根據主索引搜索時,直接找到key所在的節點即可取出數據;在根據輔助索引查找時,則需要先取出主鍵的值,在走一遍主索引。?因此,在設計表的時候,不建議使用過長的字段作為主鍵,也不建議使用非單調的字段作為主鍵,這樣會造成主索引頻繁分裂。
不同存儲引擎的索引實現方式對于正確使用和優化索引都非常有幫助,例如知道了InnoDB的索引實現后,就很容易明白1、為什么不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,2、用非單調的字段作為主鍵在InnoDB中不是個好主意,因為InnoDB數據文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。
兩種存儲引擎MyISAM與InnoDB的功能的不同:
count運算上的區別:因為MyISAM緩存有表meta-data(行數等),因此在做COUNT(*)時對于一個結構很好的查詢是不需要消耗多少資源的。而對于InnoDB來說,則沒有這種緩存。
是否支持事務和崩潰后的安全恢復: MyISAM 強調的是性能,每次查詢具有原子性,其執行數度比InnoDB類型更快,但是不提供事務支持。但是InnoDB 提供事務支持事務,外部鍵等高級數據庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
是否支持外鍵: MyISAM不支持,而InnoDB支持。
MyISAM更適合讀密集的表,而InnoDB更適合寫密集的的表。 在數據庫做主從分離的情況下,經常選擇MyISAM作為主庫的存儲引擎。
一般來說,如果需要事務支持,并且有較高的并發讀取頻率(MyISAM的表鎖的粒度太大,所以當該表寫并發量較高時,要等待的查詢就會很多了),InnoDB是不錯的選擇。如果你的數據量很大(MyISAM支持壓縮特性可以減少磁盤的空間占用),而且不需要支持事務時,MyISAM是最好的選擇。(https://zhuanlan.zhihu.com/p/49947103)
InnoDB的優勢在于提供了良好的事務處理、崩潰修復能力和并發控制。缺點是讀寫效率較差,占用的數據空間相對較大。
MyISAM的優勢在于占用空間小,處理速度快。缺點是不支持事務的完整性和并發性。
InnoDB:支持事務處理,支持外鍵,支持崩潰修復能力和并發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現并發控制(比如售票),那選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的數據庫,也可以選擇InnoDB,因為支持事務的提交(commit)和回滾(rollback)。
MyISAM:插入數據快,空間和內存使用比較低。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實現處理高效率。如果應用的完整性、并發性要求比 較低,也可以使用。
MySQL中的鎖
樂觀鎖是一種思想,具體實現是,表中有一個版本字段,第一次讀的時候,獲取到這個字段。處理完業務邏輯開始更新的時候,需要再次查看該字段的值是否和第一次的一樣。如果一樣更新,反之拒絕。之所以叫樂觀,因為這個模式沒有從數據庫加鎖,等到更新的時候再判斷是否可以更新。
悲觀鎖是數據庫層面加鎖,都會阻塞去等待鎖。
(https://juejin.im/post/5b55b842f265da0f9e589e79#comment)