力軟 java主從表保存_JAVA常用知識總結(十二)——數據庫(二)

MySQL主從熱備份工作原理

簡單的說:就是主服務器上執行過的sql語句會保存在binLog里面,別的從服務器把他同步過來,然后重復執行一遍,那么它們就能一直同步啦。

a8d3e1912b9154dbea60e8d06ab9e673.gif

整體上來說,復制有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中的鎖

6a3dbfaefb84f0bd9c1741437e68b03f.png

樂觀鎖是一種思想,具體實現是,表中有一個版本字段,第一次讀的時候,獲取到這個字段。處理完業務邏輯開始更新的時候,需要再次查看該字段的值是否和第一次的一樣。如果一樣更新,反之拒絕。之所以叫樂觀,因為這個模式沒有從數據庫加鎖,等到更新的時候再判斷是否可以更新。

悲觀鎖是數據庫層面加鎖,都會阻塞去等待鎖。

(https://juejin.im/post/5b55b842f265da0f9e589e79#comment)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453486.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HttpClient和DefaultHttpClient

HttpClient 是接口,DefaultHttpClient是實現這個接口的子類 public interface HttpClient {/*** Obtains the parameters for this client.* These parameters will become defaults for all requests being* executed with this client, and for the parameters of…

Go語言版黑白棋

1、游戲說明2、無邊框窗口實現3、背景圖、最小化、關閉窗口4、界面其它設計5、黑白子提示閃爍效果6、落子7、初始化棋子、改變角色8、倒計時9、吃子10、棋子個數統計、勝負判斷11、機器落子 轉載于:https://www.cnblogs.com/tennysonsky/p/8442827.html

vue使用render渲染jsx

vue&jsx文檔 vue實例屬性 // App.ts import hBtn from ./components/hBtn import hUl from ./components/hUlexport default {data(){return {theme: "mdui-theme-pink",accent: "mdui-theme-accent-pink",users:[aoo, boo, coo]}},methods:{},render(…

java中的多線程有什么意義_Java多線程與并發面試題(小結)

1,什么是線程?線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。程序員可以通過它進行多處理器編程,你可以使用多線程對運算密集型任務提速。比如,如果一個線程完成一…

IT必須掌握的常用命令

一,ping      它是用來檢查網絡是否通暢或者網絡連接速度的命令。作為一個生活在網絡上的管理員或者黑客來說,ping命令是第一個必須掌握的DOS命令,它所利用的原理是這樣的:網絡上的機器都有唯一確定的IP地址,我們…

Callable類

(一) Callable和Runnable比較相似,都可以用來實現線程任務。但callable使用了泛型設計,使用一個V類型值,能夠 在執行結束后返回一個V類型的值。而Runable只會返回一個void,不能夠獲得執行的結果。 &#x…

Java——線程的創建,線程池

線程 多線程就是一個程序中有多個線程在同時執行。 多線程下CPU的工作原理 實際上,CPU(中央處理器)使用搶占式調度模式在多個線程間進行著高速的切換。對于CPU的一個核而言,某個時刻,只能執行一個線程,而CPU的在多個線程間切換速度…

初級第一旬05— 藍字觀試題

準提法網絡佛學院 準提法教學平臺 一、高七師提倡初學準提法者,應先觀藍字,在《顯密圓通成佛心要集》中有依據嗎? 二、正修的時候,如果不得不中斷怎么辦? 三、藍字觀有幾種手印?可以單獨使用嗎?…

java并查集找朋友圈_圖—并查集(解決朋友圈問題)

圖也是一種 非線性結構,是由多個頂點組成的關系集合組成的一種數據結構。圖可以分為兩種,無向圖和有向圖。★圖的定義:★典型問題:利用圖能夠解決很多問題,這里有一個較為典型的問題,假如已知有n個人和m對好友關系(存于…

技術這東西,不可不看,不可全看.

最近忙著玩開心,好久沒來CSDN了,首頁上有90后程序員的消息了,稍微感慨一下,曾幾何時,自己這個80后還被70后的前輩所笑話,轉眼就成了5年經驗的老油條了.呵呵. 5年,個人認為經歷還是有些代表性的,就跟剛入行或者即將入行的哥們交個底吧,這5年到底學到了什么. 如果你看完這篇文…

rand.nextint()

自從JDK最初版本發布起,我們就可以使用java.util.Random類產生隨機數了。在JDK1.2中,Random類有了一個名為nextInt()的方法:public int nextInt(int n)給定一個參數n,nextInt(n)將返回一個大于等于0小于n的隨機數,即&a…

Android開發常用的插件及工具

1、GitHub,這個不管是做安卓還是其他,只要是開發就必上的網站,也是天朝沒有墻掉為數不多的網站 2、Stack OverFlow,這個和上面一樣,國外非常著名的問答網站,在上面基本上很多問題都可以得到解決 3、Genymotion模擬器,搞…

java poi 設置標題_poi生成Word時指定文本樣式,如“正文”,“標題1”,“標題2”等...

POI生成Word時,設置段落的樣式String style "2"; //標題2的樣式XWPFParagraph xwpfParagraph doc.insertNewParagraph(run);xwpfParagraph.setStyle(style);其實設置其他的樣式都一樣。例如:你想設置你的樣式為“標題2”(“標題2”只是你在w…

使用python做最簡單的爬蟲

使用python做最簡單的爬蟲 --之心 #第一種方法import urllib2 #將urllib2庫引用進來responseurllib2.urlopen("http://www.baidu.com") #調用庫中的方法,將請求回應封裝到response對象中htmlresponse.read() #調用response對象的read(&#x…

SurfaceView介紹

SurfaceView介紹 通常情況程序的View和用戶響應都是在同一個線程中處理的,這也是為什么處理長時間事件(例如訪問網絡)需要放到另外的線程中去(防止阻塞當前UI線程的操作和繪制)。但是在其他線程中卻不能修改UI元素&…

產品與市場,究竟哪一個重要

上篇我們講到B2C繼B2B和C2C紅透之后,也正在迅速的竄紅。這一看法可不是我老邢杜撰,憑空想出來的,我們也可以從近期的主要媒體雜志上看到這個彌端。《二十一世紀報道》、《創業家》、《市場與營銷》這些經濟類雜志,均用大幅篇幅甚至…

enumerate()使用

enumerate()使用 如果對一個列表,既要遍歷索引又要遍歷元素時,首先可以這樣寫: list1 ["這", "是", "一個", "測試"] for i in range (len(list1)): print i ,list1[i] 上述方法有些累贅&#xff0…

php在window,php在window上的問題

C:/php-7/php-cgi.exe -b 127.0.0.1:9000 -c C:/php-7/php.ini用以上方式打開php的話,會自動的關閉,到處查了后說什么東西默認是500次,到了的話cgi就會關閉所以才想到用以下的批處理辦法去解決echo offecho Starting PHP FastCGI...set PHP_F…

(三)SpringBoot之配置文件詳解:Properties和YAML

一、配置文件的生效順序,會對值進行覆蓋: 1. TestPropertySource 注解2. 命令行參數3. Java系統屬性(System.getProperties())4. 操作系統環境變量5. 只有在random.*里包含的屬性會產生一個RandomValuePropertySource6. 在打包的j…

fscanf()php,fscanf函數的用法

以前解析有規律的文件的時候要么用正則表達式,要么就是傻傻的自己寫程序來解析有規律的文件。今天突然發現c的庫函數中有一個現成的可以解析有規律的文件的函數,就是fscanf()函數。fscanf 位于頭文件中,函數原型為 int fscanf(FILE * stream,…