MySQL數據庫使用(二)

1.鍵的概念

  • :數據庫中的鍵(key)又稱爲關鍵字,是關係模型中的一個重要概念,它是邏輯結構,不是數據庫的物理部分;html

  • 惟一鍵:即一個或者一組列,其中沒有重複的記錄,能夠惟一標示一條記錄;mysql

  • 主鍵:屬於惟一鍵,是一個比較特殊的惟一鍵,區別在於主鍵不可爲空;sql

# id爲主鍵  name是惟一鍵
create table Mark(id int not null primary key ,name varchar(250) unique key);

create table Mark(id int, name varchar(250), primary key(id), unique key(name));
  • 外鍵:一張表外鍵的值通常來講是另外一張表主鍵的值,所以,外鍵的存在使得表與表之間能夠聯繫起來;
create table students_to_teacher(to_id int, stu_id int, tea_id int, foreign key(stu_id) references students(id), foreign key(tea_id) references teacher(id));

2.索引的概念

  • 索引就像是一張表的目錄,在查找內容以前能夠先在目錄中查找索引位置,以此快速定位查詢數據,保存索引數據的文件通常會與保存數據的目錄分開;數據庫

  • 索引應該構建在常常被用做查詢條件的字段上;緩存

3.索引類型

  • 普通索引:加速查詢;
# 建立普通索引
create index 索引名稱 on 表名(列名)

# 刪除普通索引
drop index 索引名稱 on 表名

# 查看索引
show index from 索引名
  • 惟一索引(UNIQUE KEY):加速查詢 + 列值惟一(能夠有null);
# 建立惟一索引
create unique index 索引名稱 on 表名(列名)

# 刪除惟一索引
drop unique  index 索引名稱 on 表名
  • 主鍵索引(PRIMARY KEY):用於加速查詢,只能有一個主鍵字段,不容許重複且不能爲NULL;服務器

  • 組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併;數據結構

  • 全文索引:對文本的內容進行分詞,進行搜索;架構

  • 空間索引:指依據空間對象的位置和形狀或空間對象之間的某種空間關係按必定的順序排列的一種數據結構;併發

4.引優化策略

  • 獨立使用列,儘可能避免其參與運算;
  • 左前綴索引:查詢字段的時候,條件過濾時,最左前綴精確匹配;
  • 多列索引:AND 鏈接字段時適合多列索引,選擇合適的索引次序,將選擇性最高的放在左側,範圍匹配的放在右側;

5.Innodb 存儲引擎

  • 全部的InnoDB表的數據和索引存儲於同一個表文件中,可是表數據和表結構分離;
-rw-rw---- 1 mysql mysql    65 8月  27 14:31 db.opt
    -rw-rw---- 1 mysql mysql  8614 8月  27 14:31 students.frm
    -rw-rw---- 1 mysql mysql 98304 8月  27 14:31 students.ibd

    db.opt文件:主要用來存儲當前數據庫的默認字符集和字符校驗規則
    students.frm文件:存放表結構的
    students.ibd文件:存儲了當前表的數據和相關的索引數據
    所以,表數據和表結構分離, 每一個表單獨使用一個表文件來存儲數據和索引
  • Mariadb默認的存儲引擎是XtraDB,可是爲了與MySQL兼容,所以也取名作InnoDB,由於MySQL的默認存儲引擎是InnoDB;函數

  • 使用匯集索引(數據和索引在一塊兒),也支持自適應hash索引,鎖粒度爲行級別,支持支持熱備工具;

  • 支持事務的存儲引擎,適合處理大量的短時間事務;

6.MyISAM 存儲引擎

  • 全部的MyISAM表的數據和索引存放在不一樣的文件中,表結構也分離;
-rw-rw---- 1 mysql mysql  10630 8月  27 13:12 user.frm
-rw-rw---- 1 mysql mysql    504 8月  27 13:15 user.MYD
-rw-rw---- 1 mysql mysql   2048 8月  27 14:30 user.MYI
user.frm:爲表結構
user.MYD:爲表數據
user.MYI:爲表索引
  • 支持全文索引(fulltext index),壓縮,空間函數;

  • 不支持事物,表級鎖,適用於只讀,讀多寫少;

7.MySQL的併發訪問控制

  • 任何的數據集只要支持併發訪問模型就必須基於鎖機制進行訪問控制;

  • 讀鎖:共享鎖,容許給其餘人讀,不容許他人寫;

  • 寫鎖:獨佔鎖, 不容許其餘人讀和寫;

  • 顯示鎖:用戶手動請求讀鎖或寫鎖;

  • 隱式鎖:由存儲引擎自行根據須要加的,無需咱們管理;

  • 給表施加鎖機制

# lock tables 方式施加鎖
lock tables 表名稱 read   # 讀鎖
lock tables 表名稱 write  # 寫鎖

# 給表解鎖    
unlock tables;    

# flush tables 方式施加鎖
flush tables 表名稱 with read lock;   #讀鎖
flush tables 表名稱 with write lock;  # 寫鎖

8.MySQL事務機制

  • 一組原子性的SQL查詢,或多個SQL語句組成了一個獨立的單元,要麼這一組SQL語句所有執行,要麼所有不執行;

事物日誌:

  • 管理事物機制的日誌;

  • redo日誌:記錄SQL執行的語句,這些SQL語句尚未同步到磁盤上,沒有修改數據。若是數據奔潰,能夠經過撤銷SQL執行的語句來進行還原。可是,若是已經同步到磁盤上的SQL語句而言,就只能使用undo來回滾以前的數據了;

  • undo日誌:記錄沒有執行SQL的樣子,也就是記錄修改數據以前的數據記錄下來;

ACID機制:

  • automicity:原子性,整個事物中的全部操做要麼所有成功提交,要麼所有失敗回滾;

  • consistency:一致性,數據庫老是從一個一致性狀態轉化爲另外一個一致性狀態;

  • isolation: 隔離性,事物不會相互影響,一個事物所做出的操做在提交以前,是不能爲其餘事物所見,隔離有多種級別,主要是爲了併發;

  • durability:持久性,事物一旦提交,其所做的修改會保存在數據庫中,不能丟失;

9.MySQL 查詢緩存機制

  • 緩存的是查詢語句的整個查詢結果,是一個完整的select語句的緩存結果;

  • 哪些查詢可能不會被緩存 :查詢中包含UDF、存儲函數、用戶自定義變量、臨時表、mysql庫中系統表、或者包含列級別的權限表、有着不肯定值的函數;

1.query_cache_min_res_unit:查詢緩存分配內存塊的最小的分配單位,較小的值較少內存浪費,可是會致使更加平凡的內存分配操做 ,較大的值會致使浪費

2.query_cache_limit:可以緩存的最大查詢結果,對有較大結果的查詢語句,建議在select中使用SQL_NO_CACHE

3.query_cache_size:查詢緩存總共可用的內存空間,單位是字節,必須是1024整數倍

4.query_cache_type:ON , OFF , DEMAND

5.query_cache_wlock_invalidate:若是某個數據表被其餘的鏈接鎖定,是否仍然能夠從查詢緩存中返回結果,默認值爲off,表示能夠返回數據,on爲不容許
  • 緩存命中率
緩存命中率計算公式: Qcache_hits / (Qcache_hits+Com_select)

緩存命中率.png

10.MySQL 日誌分類

  • 查詢日誌 :query log ,通常不啓用;
general_log = {ON|OFF}  # 是否啓用查詢日誌
general_log_file = /logs/mysql/general_log  # 當log_output爲FILE類型時,日誌信息的記錄位置;
log_output = {TABLE|FILE|NONE} 
log_output = TABLE,FILE
  • 慢查詢日誌:slow_query_log ,用於對執行速率較慢的SQL語句就像過濾,有利於SQL代碼的優化;
1.執行時長超出指定時長的操做 
show global variables like 'long_query_time'; 查看指定的時長
set global long_query_time = 自定義時長

2.slow_query_log = {ON|OFF}:是否啓用慢查詢日誌
set global slow_query_log = ON

3.slow_query_log_file = mariadb1-slow.log

# 過濾條件
4.log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk 

5.log_slow_rate_limit = 1 指定記錄速率

6.log_slow_verbosity = 指定內容級別
  • 錯誤日誌:error log ,必須啓用,二進制日誌能夠反應MySQL數據庫的錯誤信息,用於調試;
# 錯誤日誌信息產生的來源
    mysqld啓動和關閉過程當中輸出的信息;
    mysqld運行中產生的錯誤信息;
    event scheduler運行一個event時產生的日誌信息
    在主從複製架構中的從服務器上啓動從服務器線程時產生的日誌信息;

# 如何開啓錯誤日誌
    log_error = /path/to/somefile
    log_warnings = {ON|OFF}:是否記錄警告信息於錯誤日誌中;
  • 二進制日誌:binary log,用於經過'從新執行'日誌文件中的記錄的事件(SQL語句)來生成數據副本,也就是用於主從複製;
# 日誌記錄的格式分類
    基於「SQL語句」記錄: statement
    基於「行」記錄:row
    「混合模式」 :mixed,系統自行判斷


# 二進制日誌文件的構成
    日誌文件:mysql-bin.文件序號 
        例如: mysql-bin.000001
    索引文件:mysql-bin.index 
        例如:mysql-bin.index
  • 中繼日誌:relay log ,在主從複製架構中,從服務器用於保存從主服務器的二進制日誌中讀取到的時間;

  • 事務日誌:transaction log ,事物日誌由事物型存儲引擎自行管理和使用,無需手動管理;

11.MySQL 備份策略的注意點

  • 可容忍丟失多少數據;

  • 恢復須要在多長時間內;

  • 備份的對象: 數據、二進制日誌和InnoDB的事務日誌、SQL代碼(存儲過程和存儲函數、觸發器、事件調度器等)、服務器配置文件;

  • 備份類型

1.站在數據集是否完整的角度上
    徹底備份,部分備份 

2.站在徹底備份的基礎上
    增量備份,差別備份 

3.站在是否影響數據集讀寫的角度上
    熱備份:在線備份,讀寫操做不受影響;
    溫備份:在線備份,讀操做可繼續進行,但寫操做不容許
    冷備份:離線備份,數據庫服務器離線,備份期間不能爲業務提供讀寫服務
    MyISAM存儲引擎: 可以實現溫備
    InnoDB存儲引擎: 可以實現熱備

4.站在數據存儲角度上
    物理備份:直接複製數據文件進行的備份
    邏輯備份:從數據庫中「導出」操做數據的SQL語句,再執行,實現備份

12.備份策略須要考慮的因素

  • 持鎖的時長;

  • 備份過程時長;

  • 備份負載;

  • 恢復過程時長;

13.數據庫備份具體解決方案

  • 數據:徹底備份 + 增量備份
  • 備份:物理 + 邏輯

14.備份工具介紹

  • mysqldump:邏輯備份工具,適用於全部存儲引擎,溫備;可是對InnoDB存儲引擎支持熱備;
  • scp, tar 等文件系統工具:物理備份工具,適用於全部存儲引擎;冷備;徹底備份,部分備份,不適用於Innodb存儲引擎;
  • lvm2的快照:幾乎熱備;藉助於文件系統工具實現物理備份;
  • mysqlhotcopy: 幾乎冷備;僅適用於MyISAM存儲引擎

15.MySQL 半同步複製模型

  • 所謂的半同步複製指的是一臺主節點有多個從節點,在衆多的從節點之中有一個從節點在收到主節點的二進制日誌信息以後,存儲在中繼日誌中,執行中繼日誌後,給主節點一個反饋信息,直接點收到這個反饋信息以後,返回給執行這句SQL的ORM語句,表示數據已經存儲完畢;

參考:https://www.9xkd.com/user/plan-view.html?id=4211738675

相關文章
相關標籤/搜索