1、關係型數據庫基礎前端
1. 一個好數據庫管理系統要有好的數據緩衝區管理器。哪些數據放哪些塊,哪些塊放入內存。node
2.內存同步到磁盤,物理塊上二進制數據如何轉化應用程序對應數據,都須要存儲引擎管理。存儲引擎將磁盤上物理模型(數據塊二進制數據)轉化爲邏輯模型(層次網狀關係等),理解上層組件對數據請求,擇優載入部分數據。mysql
3.鎖是併發性存在前提。程序員
當A用戶讀數據時,B用戶也讀數據,不會堵塞,讀鎖是共享鎖,能夠併發。相反寫鎖是獨佔鎖。sql
4. 死鎖:併發2用戶,A用戶操做1行和10行先鎖定1行等待鎖定10行,B用戶操做10行和1行先鎖定10行等待鎖定1行,雙方都鎖定着對方需求的資源而等待對方先釋放資源自給進行下一步操做,造成死鎖。數據庫
鎖管理器必須應用鎖策略將佔用資源少的用戶操做先退出釋放資源。apache
5. httpd-2.4有3種MPM多處理模塊( Multi-Processing Module )vim
prefork一個進程響應一個請求,一個主進程負責建立回收子進程,緩存
worker一個進程生成N個線程,一個線程響應一個請求。能夠生成M個進程,生成N個線程。能夠應對m*n個請求。由一個主進程管理m個子進程,管理m*n個子線程。安全
event一個線程響應N個請求,依靠事件回調函數調度。
Web服務器大可能是get獲取數據請求,post提交數據請求也會寫進mysql.
6. Web服務器各類請求在Web層次關聯少,不會去管理mysql如何處理2個請求間的競爭。但mysql必須管理多用戶請求間的數據同步,避免資源爭用。進程間很難進行同步。所以對於mysql數據庫,一個專用線程響應一個用戶請求,mysql線程有狀態。httpd線程無狀態,所以mysql線程可能長時間在線只要用戶沒有退出,但經過程序的API查詢,可能瞬間創建瞬間解除。所以mysql內在邏輯複雜,併發性低,必須加速。高併發狀況下進程的建立釋放都會佔用大量時間。進/線程複用,用戶退出後數據清除進程不會被銷燬,放入線程池(thread pool),線程池管理器決定能處理多少用戶請求,保證用戶請求與線程複用的創建。
7.事務:一組DML語句
ACID 原子一致隔離持久
7.1原子性Atomicity 一個事務(transaction)中的全部操做DML要麼都執行,要麼都不執行。不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
7.2一致性Consistency 數據庫從一狀態轉到另外一狀態,數據總量不變。
7.3隔離性Isolation 當兩個或者多個事務併發訪問(查詢和修改的操做)數據庫的同一數據時必須相互隔離,不能相互干擾。事務隔離級別由低到高,包括讀未提交(Read uncommitted)、讀提交(readcommitted)、可重讀(repeatable read)和可串行化(Serializable)。隔離越高,併發越低。Mysql的默認隔離級別在第3級可重讀。其餘數據庫隔離級別在第2級讀提交。Mysql是插件式事務引擎,其餘數據庫未必支持事務。在事務引擎下才有隔離,例如innode。
7.4持久性Durability 在事務完成之後,該事務對數據庫所做的更改持久完整地保存在數據庫中。事務已提交,數據操做持久保留,事務未提交或因故未完成,數據操做必須可撤回。依靠事務日誌保持4性。
2、Mysql日誌與語言
8.MySQL日誌
8.1錯誤日誌:
1.記錄mysql服務器的啓動、關閉和運行錯誤的信息。
2.事件調度器運行一個事件時產生的信息。
3.在從服務器上啓動從服務器進程時產生信息
8.2查詢日誌:記錄用戶登陸和記錄查詢的信息。
8.3慢查詢日誌:記錄執行時間超過指定時間的操做。
8.4事務日誌:將離散隨機I/O轉化爲順序I/O,爲保證持久性,事務一提交,操做當即寫入磁盤。能夠重複利用操做仍可獲得相同結果,即冪等性。對磁盤而言,順序I/O執行效率高於隨機I/O一個數量級,所以DBOS數據庫操做系統按必定策略每隔必定時間將數據操做執行到數據庫中。事務日誌中數據兩兩或三三輪轉,但事務日誌包含未執行操做和未更新數據,而查詢只能對錶作查詢操做,數據庫引擎必須提供對錶對事務日誌同時查詢能力,兩者結果生成視圖返回用戶,不然返回數值不正確。事務日誌越大,寫入性能越好,併發性越好。但對其餘性能壓力極大,所以事務日誌通常不大。數據庫故障從新啓動時,必須對已經提交數據操做寫入表,未提交數據操做撤回原態。此數據庫自我修復過程必須隔離用戶參與,事務日誌越大,修復操做則越多,出錯機率越大。用戶強行中斷會引發數據庫文件崩潰。若是存放事務日誌的磁盤損壞,沒法執行數據操做,數據丟失。所以要保存2份事務日誌在不一樣磁盤。爲存儲安全和I/O效率,事務日誌與數據文件不要存於同一磁盤或同一分區。Oracle事務日誌又細分重作日誌redo.log與撤銷日誌undo.log
注:傳統機械磁盤最大的問題在於讀寫磁頭,隨機I/O須要花費昂貴的磁頭旋轉和定位來查找,順序IO訪問的速度遠遠快於隨機IO。
Mysql在修改數據時只須要修改內存,再把修改行爲記錄到事務日誌中(順序IO),不用每次將數據修改自己持久化到硬盤(隨機IO),大大提升性能。
8.5二進制日誌,用戶執行的DML。必須獨佔執行二進制日誌。以二進制文件形式記錄數據庫中的操做,但不記錄查詢語句。二進制日誌大小上限1GB
8.6中繼日誌:MySQL主從複製架構中,從服務器遠程複製主服務器二進制日誌到本地的中繼日誌。從服務器按中繼日誌執行一遍以還原數據庫。中繼日誌的本體主二進制日誌已經備份,因此它就無需備份。
9.SQL四種語言
9.1DML(Data Manipulation Language)數據操縱語言:
原先CRUD如今SIUD(Select查詢,Insert插入,Update更新,Delete刪除)
對數據操做的語句
由DBMS提供,用於讓用戶或程序員使用,實現對數據庫中數據的操做。
DML分紅交互型DML和嵌入型DML兩類。
依據語言的級別,DML又可分紅過程性DML和非過程性DML兩種。
須要commit.
SELECT
INSERT
UPDATE
DELETE
MERGE
CALL
EXPLAINPLAN
LOCKTABLE
9.2DDL(Data Definition Language)數據庫定義語言:CREATE建立,DROP刪除,ALTER修改
操做數據庫對象:表,索引,視圖,存儲過程,存儲函數,觸發器,遊標,事件調度器
用於定義數據庫的三級結構,包括外模式、概念模式、內模式及其相互之間的映像,定義數據的完整性、安全控制等約束
DDL不須要commit.
CREATE
ALTER
DROP
TRUNCATE
COMMENT
RENAME
9.3 DCL(Data Control Language)數據庫控制語言:受權,角色控制等
GRANT受權,REVOKE撤權
9.4.TCL(Transaction Control Language)事務控制語言
SAVEPOINT設置保存點
ROLLBACK回滾
SETTRANSACTION
10. 順序文件組織:
聚簇索引:把索引值直接保存在索引(所在數據塊)上,索引有序,記錄有序。樹狀索引有序
順序文件記錄自己按順序存儲,此索引即爲聚簇索引。順序文件與索引按索引順序存一塊兒即爲順序文件。聚簇索引,找到索引,即找到數據。
3、存儲引擎
11.Mysql存儲引擎
MyISAM
表:
數據文件:表名.MYD
索引文件:表名.MYI
表定義:表名.frm
InnoDB
支持事務和聚簇索引(數據和索引存放在一塊兒)
表:
表空間: 多張表可放置於同一個表空間;表空間多個數據庫可共享;ibdata110G後裂變
MySQL支持單表使用獨立的表空間文件;建議使用,默認不開。innodb_file_per_table
表定義文件:每張表的表定義文件在數據庫目錄中;test.frm
數據和索引:test.ibd
存儲引擎:也稱做表類型,一個服務數據庫就是一個物理目錄
MyISAM表:
tbname.MYD 數據
tbname.MYI 索引
tbname.frm 格式
[root@station253~]# ls /mydata/data/mydb
db.opttb1.frmtb1.MYDtb1.MYI
InnoDB表:
mysql>CREATE TABLE tb2(id INT,name VARCHAR(30),Info MEDIUMTEXT) ENGINE InnoDB;
mysql>SHOW TABLE STATUS\G;
mysql>show table status LIKE 'tb2'\G;
***************************1. row ***************************
Name: tb2
Engine: InnoDB
修改存儲引擎從InnoDB到MyISAM
mysql --default_storage_engine='InnoDB'手工改爲MyISAM
缺省修改在會話
mysql> SHOW GLOBAL VARIABLES LIKE'%engine%';
+---------------------------+--------+
| Variable_name| Value|
+---------------------------+--------+
| default_storage_engine|InnoDB |
| engine_condition_pushdown | ON|
| storage_engine| InnoDB |
+---------------------------+--------+
動態修改,重啓服務失效
mysql>SET default_storage_engine='MyISAM';
修改配置文件
[root@station253 mysql]# vim /etc/my.cnf
在[mysqld]端最後加
default_storage_engine= MyISAM
重啓mysql
[root@station253 mysql]# service mysqldrestart
mysql> SHOW GLOBAL VARIABLES LIKE'%engine%';
+---------------------------+--------+
| Variable_name| Value|
+---------------------------+--------+
| default_storage_engine| MyISAM |
| engine_condition_pushdown | ON|
| storage_engine| MyISAM |
InnoDB 默認會將全部的數據庫InnoDB引擎的表數據存儲在一個共享空間中ibdata1,但增刪數據庫的時候,ibdata1文件不會自動收縮,單個數據庫的備份也將成爲問題。一般只能將數據使用mysqldump導出,而後再導入解決這個問題。
能夠修改InnoDB爲獨立表空間模式,每一個數據庫的每一個表都會生成一個數據空間。
mysql> SET GLOBALinnodb_file_per_table=1;
獨立表空間:
優勢:
1.每一個表都有自已獨立的表空間。
2.每一個表的數據和索引都會存在自已的表空間中。
3.能夠實現單表在不一樣的數據庫中移動。
4.空間能夠回收(除drop table操做處,表空不能自已回收)
缺點:
單表增長比共享空間方式更大。
結論:
共享表空間在Insert操做上有一些優點,但在其它都沒獨立表空間表現好。
當啓用獨立表空間時,合理調整innodb_open_files參數。
mysql>SHOW SESSION VARIABLES LIKE 'innodb_file_per_table';
+-----------------------+-------+
|Variable_name| Value |
+-----------------------+-------+
|innodb_file_per_table | OFF|
+-----------------------+-------+
開啓InnoDB爲獨立表空間模式
mysql>SET GLOBAL innodb_file_per_table=1; 只有全局沒有會話
QueryOK, 0 rows affected (0.00 sec)
mysql>SHOW SESSION VARIABLES LIKE 'innodb_file_per_table'; 驚奇的是會話級的變量也改變了
+-----------------------+-------+
|Variable_name| Value |
+-----------------------+-------+
|innodb_file_per_table | ON|
+-----------------------+-------+
mysql>CREATE TABLE tb3(id INT,name VARCHAR(30),Info MEDIUMTEXT) ENGINE InnoDB;
mysql>SHOW TABLE STATUSWHERE Name='tb3'\G
***************************1. row ***************************
Name: tb3
Engine: InnoDB
建議:同一個庫中的表最好使用相同的存儲引擎; MyISAM不支持事務回滾,InnoDB支持事務回滾
12.當前服務器運行參數全局/當前用戶會話
mysql> SHOW {global|session}VARIABLES;
動態調整VARIABLES
當前服務器統計狀態參數
mysql> SHOW{global|session}STATUS;
4、受權
13.不要使用root直接對應用程序受權,防止被盜用
在須要時,爲應用程序提供受權帳戶,不要一直用root登陸mysql
不要把管理員和密碼直接填入某個配置文件,***攻破Web能經過apache帳戶看mysql配置文件,看mysql SA和密碼,遠程鏈接mysql,隨心所欲。
3306端口,在三層交換機裏面,用訪問控制列表設定只有服務器IP,管理員IP登陸mysql server,而後ROOT只能127.0.0.1登陸。其餘程序訪問mysql庫,只能用服務器上對應低權限用戶登錄,不能借用root。不容許建立,不容許drop.建立用戶的時候分配權限就行了
只受權CEARTE,ALTER,CREATETEMPORARY TABLES,DELETE,INSERT,LOCK TABLES,SELECT,UPDATE,SHOW DATABASES,SHOWVIEW,PROCESS
生產環境下相應的權限控制是必不可少的,假如***經過sql非法注入攻破前端應用程序,拿到後臺管理員權限,再結合提權,服務器就淪陷了。
不到萬不得已,不要受權mysql用戶遠程訪問權限。
grant all privileges on *.* to root@'%' 這種作法至關危險
不要受權root用戶遠程訪問mysql權限
非要使用Mysql SA帳戶,先登陸到mysql 服務器,再本地鏈接mysql。
14.mysql上權限有轉移功能,WITH GRANT OPTION, SA受權給某一用戶,他還可轉而受權給其餘人。轉移有風險。注意不用WITH GRANT OPTION。網上不少文檔不通過仔細考慮權限風險都有此句。
五.Mysql優化
15.一條語句自動提交一個事務
mysql> SHOW GLOBAL VARIABLES LIKE'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit| ON|
+---------------+-------+
表示:自動提交,都會引發IO,Innodb建議關閉,關閉自動提交功能;提升性能
mysql>set global autocommit='OFF';
QueryOK, 0 rows affected (0.00 sec)
修改後全局變量"自動提交" 關閉態
mysql>show global variables like 'autocommit';
+---------------+-------+
|Variable_name | Value |
+---------------+-------+
|autocommit| OFF|
+---------------+-------+
1 row inset (0.00 sec)
重啓服務後動態設置全局變量失效
在初始化參數文件中設置
[mysqld]
init_connect=’SET autocommit=0′
6、MySQL邏輯架構
MySQL邏輯架構圖
1.最上層是一些客戶端和鏈接服務,包含本地sock通訊和大多數基於客戶端/服務端工具實現的相似於tcp/ip的通訊。主要完成一些相似於鏈接處理、受權認證、及相關的安全方案。在該層上引入了線程池的概念,爲經過認證安全接入的客戶端提供線程。一樣在該層上能夠實現基於SSL的安全連接。服務器也會爲安全接入的每一個客戶端驗證它所具備的操做權限。
2.第二層架構主要完成大多少的核心服務功能,如SQL接口,並完成緩存的查詢,SQL的分析和優化及部份內置函數的執行。全部跨存儲引擎的功能也在這一層實現,如過程、函數等。在該層,服務器會解析查詢並建立相應的內部解析樹,並對其完成相應的優化如肯定查詢表的順序,是否利用索引等,最後生成相應的執行操做。若是是select語句,服務器還會查詢內部的緩存。若是緩存空間足夠大,這樣在解決大量讀操做的環境中可以很好的提高系統的性能。
3.存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器經過API與存儲引擎進行通訊。不一樣的存儲引擎具備的功能不一樣,這樣咱們能夠根據本身的實際須要進行選取。
4.數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的交互。
注:最後部分出自蘭心hui性的blog:MySQL運行原理與基礎架構