你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛!
死鬼~看完記得給我來個三連哦!
mysql
本文主要介紹 Mysql開發和麪試中所必知的
本文較長,分爲上下篇(可收藏,勿吃塵)
若有須要,能夠參考
若有幫助,不忘 點贊 ❥web
- MySQL 的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。
- 具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_query_time的默認值爲10,意思是運行10秒以上的語句。
- 咱們能夠查看哪些SQL超出了咱們的最大忍耐時間值,好比一條SQL執行超過5秒鐘,咱們就算慢SQL,但願能收集超過5秒的sql,能夠結合以前explain進行全面分析。
開始使用:
默認狀況下,MySQL數據庫沒有開啓慢查詢日誌,須要咱們手動來設置這個參數。
經過show variables like '%slow_query_log' 查看是否開啓了慢查詢日誌
面試
# 如下方式只對當前數據庫有效,MySQL重啓後失效
set global slow_query_log = 1;
set global long_query_time = 1.0;
# 主要從新鏈接或者新開一個會話才能看到修改值
set session long_query_time = 1.0;
複製代碼
永久生效就得修改 my.cnfsql
slow_query_log = 1
#指定生成位置,若是沒有指定默認生成 host_name-slow.log
slow_query_log_file=/var/lib/mysql/cbuc_slow.log
複製代碼
開啓後若是long_query_time沒有指定,默認爲10秒,那麼假如運行時間正好等於long_query_tie的狀況,並不會被記錄下來,也就是說在mysql源碼裏面的判斷是大於long_query_time,而非大於等於
實驗:數據庫
# 手動製造一條慢SQL
select sleep(9)
複製代碼
跟蹤日誌文件 : tail -50f cbuc_slow.log
windows
show global status like '%Slow_queries%'
複製代碼
【配置小結】
在 my.ini或者my.cnf配置文件下的配置緩存
show_query_log = 1;
show_query_log_file = /var/lib/mysql/cbuc_slow.log
long_query_time = 3;
log_output = FILE
複製代碼
日誌分析工具mysqldumpslow
查看mysqldumpslow的幫助信息:服務器
【使用參考】
一、 獲得返回記錄集最多的10個SQLsession
mysqldumpslow -s -t 10 /var/lib/mysql/cbuc_slow.log
複製代碼
二、 獲得訪問次數最多的10個SQL數據結構
mysqldumpslow -s -c -t 10 /var/lib/mysql/cbuc_slow.log
複製代碼
三、 獲得按照時間排序的前10條裏面含有左鏈接的查詢語句
mysqldumpslow -s -t -t 10 -g "left join" /var/lib/mysql/cbuc_slow.log
複製代碼
四、 另外建議在使用這些命令是結合 | 和 more使用, 不然有可能出現爆屏的狀況
mysqldumpslow -s r -t 10 /var/lib/mysql/cbuc_slow.log | more
複製代碼
- 是mysql提供能夠用來分析當前會話中語句執行的資源消耗狀況,能夠用於SQL的調優的測量
- 默認狀況下,參數處於關閉狀態,並保存最近15次的運行結果
【分析步驟】
# 默認是關閉,使用前須要開啓
show variables like 'profiling';
複製代碼
set profiling = 1;
複製代碼
# 運行兩個SQL查看
select * from tbl_emp a left join tbl_dept b on a.deptId = b.id
select * from tbl_emp a right join tbl_dept b on a.deptId = b.id
複製代碼
查看結果 :
參數說明:
my.cnf
或my.ini
中設置# 開啓
general_log = 1
# 記錄日誌文件的路徑
general_log_file = /path/logfile
# 輸出格式
log_output = FILE
複製代碼
set global general_log = 1;
set global log_output = 'TABLE'
select * from mysql.general_log
鎖是計算機協調多個進程或線程併發訪問某一資源的機制。
在數據庫中,除傳統的計算資源(如CPU、RAM、I/O等)的爭用之外,數據也是一種供許多用戶共享的資源。如何保證數據併發訪問的一致性,有效性是全部數據庫必須解決的一個問題,鎖衝突也是影響數據庫併發訪問性能的一個重要因素。從這個角度來講,鎖對數據庫而言顯的尤爲重要,也更加複雜。
【案例理解】
一件商品這個時候只有一件庫存,可是同時用A、B兩我的要下單,那麼是A下單成功仍是B下單成功。
這種時候就要使用到事務,咱們要先從庫存表中取出物品數量,而後生成訂單,付款成功後生成付款信息,再更新商品數量。這個流程中,咱們須要使用到鎖對有限的資源進行保護,解決隔離和併發問題。
【鎖的分類】
【表鎖】
特色:(偏讀)
偏向MyISAM存儲引擎,開銷小,加鎖快;無死鎖;鎖定粒度大;發生鎖衝突的機率高,併發度最低。
- 手動加鎖:
lock table <table_name1> <read/write>,<table_name2> <read/write>
複製代碼
show open tables;
複製代碼
unlock tables;
複製代碼
讀鎖說明:
新建兩個session會話,session1 和session2
此時在session1中對mylock表進行read 鎖定,狀況以下:
鎖定的表
都會提示錯誤,session2插入或更新鎖定的表
會一直等待。寫鎖說明:
一樣新建兩個session會話,session1 和session2
此時在session1中對mylock表進行write 鎖定,狀況以下:
【小結】
:
MyISAM在執行查詢語句的前,會自動給涉及的全部表加讀鎖,在執行增刪改操做前,會自動給涉及的表加寫鎖。
鎖類型 | 他人可讀 | 他人可寫 |
---|---|---|
讀鎖 | 是 | 否 |
寫鎖 | 否 | 否 |
一、 對MyISAM表的讀操做(加讀鎖),不會阻塞其餘進程對同一表的讀請求,但會阻塞對同一表的寫請求,只有當讀鎖釋放後,纔會執行其餘進程的寫操做。
二、 對MyISAM表的寫操做(加寫鎖),會阻塞其餘線程對同一表的讀和寫操做,只用當寫鎖釋放後,纔會執行其餘進程的讀寫操做。
總結:讀鎖會阻塞寫,可是不會阻塞讀。而寫鎖則會把讀和寫都阻塞
【行鎖】
特色:(偏讀)
偏向InnoDB存儲引擎,開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高。
InnoDB與MyISAM的最大不一樣有兩點:
- 支持事務(TRANSACTION)
- 採用了行級鎖
事務複習:
事務是由一組SQL語句組成的邏輯處理單元,事務具備如下4個屬性,一般簡稱爲事務的ACID屬性。
原子性(Atomicity):
事務是一個原子操做的單元,其對數據的修改,要麼所有執行,要麼全都不執行。一致性(Consistent):
在事務開始和完成時候,數據都必須保持一致狀態。這意味着全部相關的數據規則都必須應用於事務的修改,以保持數據的完整性;事務結束時,全部內部的數據結構(如B樹索引或雙向鏈表)也都必須是正確的。隔離性(Isolation):
數據庫系統提供必定的隔離機制,保證事務在不受外部併發操做影響的「獨立」環境執行。這意味着事務處理過程當中的中間狀態對外部是不可見的,反之亦然。持久性(Durable):
事務完成以後,它對於數據的修改是永久性的,即便出現系統故障也可以保持。併發事務處理帶來的問題:
更新丟失(Lost Update)
髒讀(Dirty Reads)
不可重複讀(Non-Repeatable Reads)
幻讀(Phantom Reads)
事務隔離級別:
# 查看事務的隔離級別
show variable like 'tx_isolate'
複製代碼
隔離級別 | 讀數據一致性 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|---|
未提交讀(Read uncommitted) | 最低級別,只能保證不讀取物理上損壞的數據 | 是 | 是 | 是 |
已提交讀(Read committed) | 語句級 | 否 | 是 | 是 |
可重複讀(Repeatable read) | 事務級 | 否 | 否 | 是 |
可序列化(Serializable) | 最高級別,事務級 | 否 | 否 | 否 |
寫鎖(排他鎖):
加上排它鎖後,其餘事務不能再對A加任何類型的鎖。已獲取到排它鎖的事務既能讀數據,又能修改數據。
# 經過這段加鎖,mysql會對查詢結果中的每行都加排他鎖
select ... for update;
複製代碼
間隙鎖:
當咱們用範圍條件而不是相等條件檢索數據,並請求共享或排他鎖時,InnoDB會給符合條件的已有數據記錄的索引項加鎖;對於鍵值在條件範圍內但並不存在的記錄,叫作「間隙(GAP)」
InnoDB也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖(GAP Lock)危害:
由於Query執行過程當中經過範圍查找的話,他會鎖定整個範圍內全部的索引鍵值,即便這個鍵值並不存在,間隙鎖有一個比較致命的弱點,就是當鎖定一個範圍鍵值以後,即便某些不存在的鍵值也會被無辜的鎖定,而形成在鎖定的時候沒法插入鎖定鍵值範圍內的任何數據。在某些場景下這可能會對性能形成很大的危害優化建議:
【頁鎖】
slave 會從 master 讀取binlog來進行數據同步
【三個步驟】
複製的最大問題: 延遲
mysql 版本一致且後臺以服務運行,主從配置都在[mysqld]結點下,都是小寫
【主機修改my.ini配置文件】
server-id = 1
複製代碼
log-bin = 本身本地的路徑/data/mysqlbin
log-bin = D:/devSoft/MySQLServer5.5/data/mysqlbin
複製代碼
log-err = 本身本地的路徑/data/mysqlerr
log-err = D:/devSoft/MySQLServer5.5/data/mysqlerr
複製代碼
basedir = "本身本地路徑"
basedir = D:/devSoft/MySQLServer5.5/
複製代碼
tmpdir = "本身本地路徑"
tmpdir = D:/devSoft/MySQLServer5.5/
複製代碼
datadir = "本身本地路徑"
datadir = D:/devSoft/MySQLServer5.5/data/
複製代碼
binlog-ignore-db = mysql
複製代碼
binlog-do-db = 須要複製的數據庫的名字
複製代碼
【從機修改my.ini配置文件】
[必須] 從服務器惟一ID
[可選] 啓用二進制文件
【修改後,主從機都須要重啓後臺mysql服務】
【主從機都須要關閉防火牆】
【在windows主機上創建帳戶並受權slave】
步驟1:
GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'從機的數據庫IP'INDETIFIED BY '123456'
複製代碼
flush privileges;
複製代碼
show master status;
# 記錄File和Position 的值
複製代碼
【在Linux從機上配置須要複製的主機】
change master to master_host = '主機IP',
master_user='zhangsan',master_password = '123456',
master_log_file='file名字',
master_log_pos=position數字
複製代碼
start slave;
複製代碼
show slave status
#下面兩個參數都是Yes,便說明主從配置成功
Slave_IO_Running:Yes
Slave_SQL_running:Yes
複製代碼
【主機新建庫,新建表,insert記錄,從機便會複製】
【中止從服務複製功能】
stop slave;
複製代碼
本文較長,能看到這裏的都是好樣的,成長之路學無止境
今天的你多努力一點,明天的你就能少說一句求人的話!好久好久以前,有個傳說,聽說:
看完不讚,都是壞蛋