1. 程式人生 > 其它 >2021小學生新學期開學寄語,老師家長給孩子的簡短寄語用便籤記錄

2021小學生新學期開學寄語,老師家長給孩子的簡短寄語用便籤記錄

1.MySQL架構組成

  • 高階DBA的職責:
    • 負責MySQL的容量規劃,架構設計及安裝、部署.
    • 負責MySQL的日常管理,監控和維護, 並對MySQL進行持續效能優化.
    • 負責MySQL開發支援,參與資料架構規劃設計,以及相關業務的資料建模、設計評審、SQL程式碼稽核優化
  • 中級 Java開發工程師對資料庫知識的掌握程度
    • 熟練操作主流資料庫,能夠通過程式碼(框架) 完成日常的資料庫操作.
    • 熟練使用SQL, 熟悉SQL優化, 熟悉儲存過程 檢視 等建立及使用.
    • 瞭解MySQL的整體體系結構,瞭解MySQL事務 儲存引擎的特點
    • 瞭解MySQL索引優化,瞭解MySQL相關鎖機
  • MySQL架構體系介紹:MySQL 由連線池、SQL 介面、解析器、優化器、快取、儲存引擎等組成,可以分為四層,即連線層、 服務層、引擎層和檔案系統層。可插拔式
    • 連線層:最上面是一些客戶端和連線服務, 不是MySQL特有的,所有基於網路的C/S的網路應用程式都應該包括連線處理、認證、安全管理等
    • 服務層:中間層是MySQL的核心,包括查詢解析、分析、優化和快取等。同時它還提供跨儲存引擎的功能,包括儲存過程、觸發器和檢視等。
    • 引擎層:儲存引擎層,它負責存取資料。伺服器通過API可以和各種儲存引擎進行互動。不同的儲存引擎具有不同的功能,我們可以根據實際需求選擇使用對應的儲存引擎
    • 儲存層:資料儲存層,主要是將資料儲存在運行於裸裝置的檔案系統之上,並完成與儲存引擎的互動
  • SQL查詢流程:SQL SELECT 語句的執行軌跡來說明客戶端與 MySQL 的互動過程,如下圖所示

1. 通過客戶端/伺服器通訊協議與 MySQL 建立連線
2. 查詢快取,這是 MySQL 的一個可優化查詢的地方,如果開啟了 Query Cache 且在查詢快取過程中查詢到完全相同的 SQL 語句,則將查詢結果直接返回給客戶端;如果沒有開啟Query Cache 或者沒有查詢到
完全相同的 SQL 語句則會由解析器進行語法語義解析,並生成解析樹。
3. 前處理器生成新的解析樹。
4. 查詢優化器生成執行計劃。
5. 查詢執行引擎執行 SQL 語句,此時查詢執行引擎會根據 SQL 語句中表的儲存引擎型別,以及對應的API 介面與底層儲存引擎快取或者物理檔案的互動情況,得到查詢結果,由MySQL Server 過濾後將查詢結
果快取並返回給客戶端。若開啟了 Query Cache,這時也會將SQL 語句和結果完整地儲存到 QueryCache 中,以後若有相同的 SQL 語句執行則直接返回結果。
  • mysql物理檔案
    • 日誌檔案
      • error log 錯誤日誌,用於排錯, 存放在/var/log/mysqld.log【預設開啟】
      • bin log 二進位制日誌 ,用於備份,增量備份 DDL DML DCL
      • Relay log 中繼日誌,用於主從複製,接收 replication master
      • slow log 慢查詢日誌,用於效能調優, 查詢時間超過指定值
-- 檢視錯誤日誌檔案路徑
show variables like 'log_error';
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| log_error | /var/log/mysqld.log |
+---------------+---------------------+
-- 慢查詢日誌檔案路徑
show variables like 'slow_query_log_file';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
-- bin log 日誌檔案 需要在 my.cnf 中配置
log-bin=/var/log/mysql-bin/bin.log
server-id=2
-- 檢視 relay log 相關引數
show variables like '%relay%';
    • 配置檔案my.cnf進行資料庫客戶端服務端等高階配置
      [client] #客戶端設定,即客戶端預設的連線引數
      port = 3307 #預設連線埠
      socket = /data/mysqldata/3307/mysql.sock #用於本地連線的socket套接字
      default-character-set = utf8mb4 #編碼
      [mysqld] #服務端基本設定
      port = 3307 MySQL監聽埠
      socket = /data/mysqldata/3307/mysql.sock #為MySQL客戶端程式和伺服器之間的本地通訊指定一
      個套接字檔案
      pid-file = /data/mysqldata/3307/mysql.pid #pid檔案所在目錄
      basedir = /usr/local/mysql-5.7.11 #使用該目錄作為根目錄(安裝目錄)
      datadir = /data/mysqldata/3307/data #資料檔案存放的目錄
      tmpdir = /data/mysqldata/3307/tmp #MySQL存放臨時檔案的目錄
      character_set_server = utf8mb4 #服務端預設編碼(資料庫級別)
    • 資料檔案
      -- 檢視資料檔案的位置
      show variables like '%dir%';
      +-----------------------------------------+----------------------------+
      | Variable_name | Value |
      +-----------------------------------------+----------------------------+
      | datadir | /var/lib/mysql/ |
      +-----------------------------------------+----------------------------+
      
      1、.frm檔案
      不論是什麼儲存引擎,每一個表都會有一個以表名命名的.frm檔案,與表相關的元資料(meta)資訊都存放在此檔案中,包括表結構的定義資訊等。
      2、.MYD檔案
      myisam儲存引擎專用,存放myisam表的資料(data)。每一個myisam表都會有一個.MYD檔案與之呼應,同樣存放在所屬資料庫的目錄下
      3、.MYI檔案
      也是myisam儲存引擎專用,存放myisam表的索引相關資訊。每一個myisam表對應一個.MYI檔案,其存放的位置和.frm及.MYD一樣
      4、.ibd檔案
      存放innoDB的資料檔案(包括索引)。
      5. db.opt檔案 此檔案在每一個自建的庫裡都會有,記錄這個庫的預設使用的字符集和校驗規則

2.MySQL的備份與恢復

  • 資料丟失與備份場景
    • 開發測試環境資料庫搭建
    • 資料庫或者資料遷移

  • 資料備份方式
    • 完全備份:將資料庫的全部資訊進行備份,包括資料庫的資料檔案、日誌檔案,還需要備份檔案的儲存位置以及資料庫中的全部物件和相關資訊。
    • 差異備份:備份從最近的完全備份後對資料所做的修改,備份完全備份後變化了的資料檔案、日誌檔案以及資料庫中其他被修改的內容
    • 增量備份:增量備份是指在一次全備份或上一次增量備份後,以後每次的備份只需備份與前一次相比增加或者被修改的檔案。
完整備份 差異備份 增量備份
備 份 方 法 備份所有檔案 一次全備份後,備份與全
備份差異的部分
一次全備份後,備份與上次備
份的差異部分
備 份 速 度 最慢 較快 最快
恢 復 速 度 最快 較快 最慢
空 間 要 求 最多 較多 最少
優 勢 最快的恢復速度, 只需要上
一次完全備份就能恢復
相比增量,更快也更簡單
並且只需要最近一次的
完全備份
和最後一次的差異備份
就能恢復
備份速度快,較少的空間需求,沒有重複的備份檔案
劣 勢 最多的空間需求
大量重複的備份
較慢的備份速度,仍然會
存在許多的備份檔案
最慢的恢復速度,恢復需要最近一次完全備份和全部增量備份
  • 備份的組合方式:完全備份+差異備份;完全備份+增量備份
  • 冷備份:當資料庫進行備份時, 資料庫不能進行讀寫操作, 即資料庫要下線
    • 是操作比較方便的備份方法(只需拷貝檔案),低度維護,高度安全
    • 在實施備份的全過程中,資料庫必須要作備份而不能作其它工作。
    • 若磁碟空間有限,只能拷貝到磁帶等其它外部儲存裝置上,速度比較慢。
    • 不能按表或按使用者恢復
    • 實現:
1. 關閉SELinux,修改 selinux 配置檔案,將SELINUX=enforcing改為SELINUX=disabled,儲存後退出
vim /etc/selinux/config
SELINUX=disabled


2. 重啟
reboot # 重啟命令

3. 找到MySQL資料檔案位置,停止MySQL服務
SHOW VARIABLES LIKE '%dir%';
-- 結果顯示, 資料目錄就是datadir的所在位置,即 /var/lib/mysql/
service mysqld stop -- 停止mysql

4.進入到 /mysql 目錄, 執行打包命令 將資料檔案打包備份
cd /var/lib/ # 進入其上級目錄
tar jcvf /root/backup.tar.bz2 mysql/ # 打包壓縮到 root目錄下

5.  刪除掉資料目錄下的所有資料
-- 刪除原目錄
rm -rf /var/lib/mysql/

6. 恢復資料 (使用tar命令)
-- 解壓
tar jxvf backup.tar.bz2 mysql/
-- 把備份的檔案移動到/var/lib/裡面去替代原來的mysql
mv /root/mysql/ /var/lib/

7.  啟動MySQL, 然後登陸MySQL,檢視資料是否丟失, 如果資料正常代表冷備成功
service mysqld start
  • 熱備份:在資料庫執行的情況下,備份資料庫操作的sql語句,當資料庫發生問題時,可以重新執行一遍備份的sql語句
    • 可在表空間或資料檔案級備份,備份時間短。備份時資料庫仍可使用。可達到秒級恢復(恢復到某一時間點上)
    • 不能出錯,否則後果嚴重。因難維護,所以要特別仔細小心,不允許以失敗而告終
    • mysqldump工具實現熱備份,可以對多個庫進行備份,可以對單張表或者某幾張表進行備份
## 備份單個數據庫
1. 建立資料夾 , 備份資料
mkdir databackup
cd databackup
mysqldump -uroot -p lagou_edu > lagou_edu.sql

2.模擬資料丟失,刪除資料庫,然後重新建立一個新的庫
DROP DATABASE lagou_edu;
CREATE DATABASE lagou_edu CHARACTER SET 'utf8';

3.恢復資料
cd databackup
mysql -uroot -p lagou_edu < lagou_edu.sql


## 備份資料庫的某些表
1. 備份資料表
[root@localhost databackup]# mysqldump -uroot -p lagou_edu course course_lesson > backupTable.sql

2. 模擬資料丟失,刪除資料表
DROP TABLE course;
DROP TABLE course_lesson;

3. 恢復資料
mysql -uroot -p lagou_edu < backupTable.sql

##直接將MySQL資料庫壓縮備份
1. 備份資料
mysqldump -uroot -p lagou_edu | gzip > lagou_edu.sql.gz

2. 模擬刪除
DROP DATABASE lagou_edu;
CREATE DATABASE lagou_edu CHARACTER SET 'utf8';

3 .恢復資料
gunzip < lagou_edu.sql.gz | mysql -uroot -p lagou_edu

3.MySQL查詢和慢查詢日誌分析

  • sql 效能下降原因
    • 等待時間長:鎖表導致查詢一直處於等待狀態
    • 執行時間長:查詢語句爛、索引失效、關聯查詢太多join、伺服器調優及各個引數設定問題
  • 優化原則
    • 只返回需要的結果:一定要為查詢語句指定 WHERE 條件,過濾掉不需要的資料行;避免使用 select * from , 因為它表示查詢表中的所有欄位
    • 確保查詢使用了正確的索引:經常出現在 WHERE 條件中的欄位建立索引,可以避免全表掃描;將 ORDER BY 排序的欄位加入到索引中,可以避免額外的排序操作;多表連線查詢的關聯欄位建立索引,可以提高連線查詢的效能;將 GROUP BY 分組操作欄位加入到索引中,可以利用索引完成分組
    • 避免讓索引失效:WHERE 子句中對索引欄位進行表示式運算或者使用函式都會導致索引失效;使用 LIKE 匹配時,如果萬用字元出現在左側無法使用索引;如果 WHERE 條件中的欄位上建立了索引,儘量設定為 NOT NULL
  • sql執行順序

1. FORM子句 : 左右兩個表的笛卡爾積
2. ON: 篩選滿足條件的資料
3. JOIN: 如果是 inner join 那就正常,如果是 outer join 則會添加回來上面一步過濾掉的一些行
4. WHERE: 對不滿足條件的行進行移除, 並且不能恢復
5. GROUP BY: 分組後只能得到每組的第一行資料,或者聚合函式的數值
6. HAVING: 對分組後的資料進行篩選
7. SELECT: 執行select操作,獲取需要的列。
8. DISTINCT: 去重
9. ORDER BY: 排序
10. LIMIT:取出指定行的記錄, 並將結果返回。
  • join 查詢的7種方式:內連線、左右連線、全連線
  • 慢查詢日誌分析
    • MySQL的慢查詢,全名是慢查詢日誌,是MySQL提供的一種日誌記錄,用來記錄在MySQL響應時間超過閾值的語句。
    • 預設情況下,MySQL資料庫並不啟動慢查詢日誌,需要手動來設定這個引數。
    • 如果不是調優需要的話,一般不建議啟動該引數,因為開啟慢查詢日誌會或多或少帶來一定的效能影響。
    • 慢查詢日誌支援將日誌記錄寫入檔案和資料庫表
    • 慢查詢引數
      SHOW VARIABLES LIKE "%query%";
      ## slow_query_log:是否開啟慢查詢日誌, 1 表示開啟, 0 表示關閉。
      ## slow-query-log-file:新版(5.6及以上版本)MySQL資料庫慢查詢日誌儲存路徑
      ## long_query_time: 慢查詢閾值,當查詢時間多於設定的閾值時,記錄日誌
      SHOW VARIABLES LIKE "%output%";
      ## log_output 日誌檔案放到檔案裡還是表裡
    • 配置慢查詢
      • 預設慢查詢方式是禁用的,可以通過set方式開啟;設定後只對當前資料庫生效,mysql重啟後會失效
        SHOW VARIABLES LIKE "%query%";
        set global slow_query_log=1;
      • 修改my.cnf檔案永久生效
        -- 編輯配置
        vim /etc/my.cnf
        -- 新增如下內容
        slow_query_log =1
        slow_query_log_file=/var/lib/mysql/lagou-slow.log
        -- 重啟MySQL
        service mysqld restart
        mysql> SHOW VARIABLES LIKE '%slow_query_log%';
        +---------------------+-------------------------------+
        | Variable_name | Value |
        +---------------------+-------------------------------+
        | slow_query_log | ON |
        | slow_query_log_file | /var/lib/mysql/lagou-slow.log |
        +---------------------+-------------------------------+
      • 設定慢查詢的時間:show variables like 'long_query_time';set global long_query_time=1; show variables like 'long_query_time';使用命令 set global long_query_time=1 修改後,需要重新連線或新開一個會話才能看到修改值
      • log_output 引數是指定日誌的儲存方式。 log_output='FILE' 表示將日誌存入檔案,預設值是'FILE'log_output='TABLE' 表示將日誌存入資料庫,這樣日誌資訊就會被寫入到mysql.slow_log 表中
        mysql> SHOW VARIABLES LIKE '%log_output%';
        +---------------+-------+
        | Variable_name | Value |
        +---------------+-------+
        | log_output | FILE |
        +---------------+-------+
        
        MySQL資料庫支援同時兩種日誌儲存方式,配置的時候以逗號隔開即可,如:log_output='FILE,TABLE'。日誌記錄到系統的專用日誌表中,要比記錄到檔案耗費更多的系統資源,因此對於需要啟用慢查詢日誌,又需要能夠獲得更高的系統性能,那麼建議優先記錄到檔案.
      • 系統變數 log-queries-not-using-indexes :未使用索引的查詢也被記錄到慢查詢日誌中(可選項)。如果調優的話,建議開啟這個選項
        mysql> show variables like 'log_queries_not_using_indexes';
        +-------------------------------+-------+
        | Variable_name | Value |
        +-------------------------------+-------+
        | log_queries_not_using_indexes | OFF |
        +-------------------------------+-------+
        mysql> set global log_queries_not_using_indexes=1;
        Query OK, 0 rows affected (0.00 sec)
        
        mysql> show variables like 'log_queries_not_using_indexes';
        +-------------------------------+-------+
        | Variable_name | Value |
        +-------------------------------+-------+
        | log_queries_not_using_indexes | ON |
        +-------------------------------+-------+
        1 row in set (0.00 sec)
      • 檢視慢查詢日誌 cat /var/lib/mysql/mysql.log

4.MySQL儲存引擎

  • 儲存引擎如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。要求支援併發性、事務、引用的完整性和索引的支援
  • 檢視資料庫的儲存引擎
    • SHOW ENGINES;檢視MySQL資料 的所有引擎
      • 事務安全表: InnoDB
      • 非事務安全表: MyISAMMEMORYMERGEEXAMPLENDB ClusterARCHIVECSVBLACKHOLEFEDERATED
    • SHOW VARIABLES LIKE '%default_storage_engine%'; 檢視當前的預設儲存引擎 (MySQL5.7 預設使用 InnoDB)
    • MySQL,不需要整個伺服器都是用同一種引擎,針對具體的需求,可以對 每一個表使用不同的儲存引擎 .並且想要進一步優化, 還可以自己編寫一個儲存引擎create table(...) engine=MyISAM;
  • 常見的儲存引擎
    • InnoDB一個健壯的事務型儲存引擎,這種儲存引擎已經被很多網際網路公司使用,為使用者操作非常大的資料儲存提供了一個強大的解決方案。InnoDB還引入了行級鎖定和外來鍵約束,在以下場合下,使用InnoDB是最理想的選擇
      • 優點:Innodb引擎提供了對資料庫ACID事務的支援,並且實現了SQL標準的四種隔離級別;支援多版本併發控制的行級鎖,由於鎖粒度小,寫操作和更新操作併發高、速度快;支援自增長列;支援外來鍵;適合於大容量資料庫系統,支援自動災難恢復
      • 缺點:它沒有儲存表的行數,當SELECT COUNT(*) FROM TABLE時需要掃描全表
      • 應用場景:當需要使用資料庫事務時,該引擎當然是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在併發較高時,使用Innodb引擎會提升效率,更新密集的表, InnoDB儲存引擎特別適合處理多重併發的更新請求。
    • MyISAM:不支援事務、也不支援外來鍵,優勢是訪問速度快,對事務完整性沒有 要求或者以selectinsert為主的應用基本上可以用這個引擎來建立表
      • 優點:MyISAM表是獨立於作業系統的,這說明可以輕鬆地將其從Windows伺服器移植到Linux伺服器;MyISAM儲存引擎在查詢大量資料時非常迅速,進行大批量插入操作時執行速度也比較快。
      • 缺點:MyISAM表沒有提供對資料庫事務的支援。不支援行級鎖和外來鍵。不適合用於經常UPDATE(更新)的表,效率低。
      • 應用場景:以讀為主的業務,例如:圖片資訊資料庫,部落格資料庫,商品庫等業務;對資料一致性要求不是非常高的業務(不支援事務);硬體資源比較差的機器可以用 MyiSAM (佔用資源少)
    • MEMORY:將表中的資料放在記憶體中,適用於儲存臨時資料的臨時表和資料倉庫中的緯度表
      • 優點:memory型別的表訪問非常的快,因為它的資料是放在記憶體中的
      • 缺點:一旦服務關閉,表中的資料就會丟失掉。只支援表鎖,併發效能差,不支援TEXTBLOB列型別,儲存varchar時是按照char的方式
      • 應用場景:目標資料較小,而且被非常頻繁地訪問。如果資料是臨時的,而且要求必須立即可用,那麼就可以存放在記憶體表中。儲存在Memory表中的資料如果突然丟失,不會對應用服務產生實質的負面影響。
  • 如何選擇儲存引擎
    • 是否需要支援事務;
    • 崩潰恢復,能否接受崩潰;
    • 是否需要外來鍵支援;
    • 儲存的限制;
    • 對索引和快取的支援
特性 InnoDB MyISAM MEMORY
儲存限制 64TB
支援事務 支援 不支援 不支援
鎖機制 行鎖 表鎖 表鎖
B-tree索引 支援 支援 支援
雜湊索引 支援 不支援 支援
外來鍵支援 支援 不支援 不支援
儲存空間消耗
記憶體消耗
批量寫入資料消耗

5.MySQL索引優化

  • 索引就是一種將資料庫中的記錄按照特殊形式儲存的資料結構。通過索引,能夠顯著地提高資料查詢的效率,從而提升伺服器的效能
  • 使用索引後可以不用掃描全表來定位某行的資料,而是先通過索引表找到該行資料對應的實體地址然後訪問相應的資料
  • 索引種類
    • 主鍵索引
    CREATE TABLE tablename ( [...], PRIMARY KEY (欄位名) );
    ALTER TABLE tablename ADD PRIMARY KEY (欄位名);
    • 普通索引
    CREATE INDEX <索引的名字> ON tablename (欄位名);
    ALTER TABLE tablename ADD INDEX [索引的名字] (欄位名);
    CREATE TABLE tablename ( [...], INDEX [索引的名字] (欄位名) );
    • 唯一索引
    CREATE UNIQUE INDEX <索引的名字> ON tablename (欄位名);
    ALTER TABLE tablename ADD UNIQUE INDEX [索引的名字] (欄位名);
    CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (欄位名) ;
    • 複合索引
    -- 複合索引可以代替多個單一索引,相比多個單一索引複合索引所需的開銷更小。
    CREATE INDEX <索引的名字> ON tablename (欄位名1,欄位名2...);
    ALTER TABLE tablename ADD INDEX [索引的名字] (欄位名1,欄位名2...);
    CREATE TABLE tablename ( [...], INDEX [索引的名字] (欄位名1,欄位名2...) );
    • 全文索引
    --使用全文索引,查詢速度會比like快很多倍。
    -- 在MySQL 5.6 以前的版本,只有MyISAM儲存引擎支援全文索引
    -- 從MySQL 5.6開始MyISAM和InnoDB儲存引擎均支援
    CREATE FULLTEXT INDEX <索引的名字> ON tablename (欄位名);
    ALTER TABLE tablename ADD FULLTEXT [索引的名字] (欄位名);
    CREATE TABLE tablename ( [...], FULLTEXT KEY [索引的名字] (欄位名) ;
      • .全文索引方式有自然語言檢索 IN NATURAL LANGUAGE MODE 和布林檢索 IN BOOLEAN MODE兩種,有自己的語法格式,使用 match against 關鍵字
        SELECT * FROM users3 WHERE MATCH(NAME) AGAINST('aabb');
        -- * 表示萬用字元,只能在詞的後面
        SELECT * FROM users3 WHERE MATCH(NAME) AGAINST('aa*' IN BOOLEAN MODE);
      • 全文索引必須在字串、文字欄位上建立。全文索引欄位值必須在最小字元和最大字元之間的才會有效。(innodb3-84myisam4-84
  • 索引的優缺點
    • 提高資料檢索的效率,降低資料庫的IO成本;通過索引列對資料進行排序,降低資料排序的成本,降低了CPU的消耗
    • 建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加;索引需要佔物理空間,除了資料表佔用資料空間之外,每一個索引還要佔用一定的物理空間;當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度
  • 建立索引的原則
    • 在經常需要搜尋的列上建立索引,可以加快搜索的速度;
    • 在作為主鍵的列上建立索引,強制該列的唯一性和組織表中資料的排列結構;
    • 在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;
    • 在經常需要根據範圍(in,between and)進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;
    • 在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
    • 在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度


6.MySQL鎖機制

7.MySQL高可用設計

8.MySQL叢集

資料儲存層,主要是將資料儲存在運行於裸裝置的檔案系統之上,並完成與儲存引擎的互動