前言
MySQL/MariaDB是一個開放源碼的小型關聯式數據庫管理系統,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站爲了降低網站總體擁有成本而選擇了MySQL/MariaDB作爲網站數據庫。
基礎架構
MySQL核心組件
連接池:認證、線程重用、連接數限制、內存檢查、緩存
SQL接口:DDL, DML, 關係型數據庫的基本抽象
parser: 查詢轉換、對象權限檢查
優化器:訪問路徑,性能相關的統計數據
caches和buffers:與存儲引擎自身相關的I/O性能提升工具
存儲引擎:MyISAM、InnoDB(變種:XtraDB)、Memory、Merge、Federated、CSV、Archive、Blackholl、Aria、SphinxSE、TokuDB
內部結構
程序類別及命令選項
服務器端程序:啓動並監聽於套接字上;mysqld, mysqld_safe, mysqld_multi
客戶端程序:可通過mysql協議連入服務器併發出請求的;mysql, mysqlbinlog, mysqladmin, mysqldump等
工具程序:運行於服務器進程所在的主機,實現一些管理或維護操作,myisamchk
客戶端程序通用選項
-u,--user #指定登陸用戶 -h,--host #指定登陸主機 -p,--password #指定登陸密碼 --protocol={tcp|socket|memory|pipe} #指定協議 -P,--port #指定端口,默認監聽端口:tcp/3306 --socket #指定本地連接的sock文件,相當於--protocol socket --compress #數據傳輸採用壓縮格式 -D,--database #指定連接後默認使用的數據庫 -H,--html #指定產生html輸出 -X,--xml #指定產生xml輸出 --safe-updates #拒絕使用無where子句的update或delete命令
客戶端程序命令
交互式模式: #客戶端命令 mysql> help #列出所有命令 mysql> \? #相當於help mysql> \c #取消命令執行 mysql> \g #發送命令至服務器端 mysql> \G #發送命令至服務器端,垂直顯示結果 mysql> \q #退出 mysql> \! #運行shell命令 mysql> \s #顯示服務器端狀態信息 mysql> \. /path/to/somefile.sql #批量執行sql mysql> \u #將指定的庫設爲默認庫 #服務器端命令 mysql> help KEYWORD 獲取關鍵字的幫助信息 批模式: mysql < /path/from/somefile.sql
管理工具mysqladmin
格式:mysqladmin [options] command [arg] [command [arg]] ... #常用命令 create DB_Name:創建數據庫 drop DB_Name:刪除數據庫 debug:打開調試日誌並記錄於error log中 status:顯示簡要狀態信息 --sleep #間隔秒數 --count #顯示的次數 extend-status: 顯示mysqld的所有服務器狀態變量 flush-privileges: 刷新授權表,相當於reload命令 flush-hosts: 清除dns緩存及被拒絕的客戶端列表緩存 flush-logs: 滾動日誌, 二進制日誌和中繼日誌 flush-status: 重置各狀態變量 flush-tables: 關閉當前打開的所有的表文件句柄; flush-treads: 重置線程緩存; password: 設置密碼 ping: 測試服務器是否在線 processlist: 顯示當前服務器上的所有線程 refresh: 相當於執行flush-hosts和flush-logs shutdown: 關閉服務器進程 ; start-slave, stop-slave: 啓動、關閉從服務器線程; variables: 顯示服務器變量
功能特性補充
命令行編輯功能
Ctrl+a: 快速移動光標至行首 Ctrl+e: 快速移動光標至行尾 Ctrl+w: 刪除光標之前的單詞 Ctrl+u: 刪除行首至光標處的所有內容 Ctrl+y: 粘貼使用Ctrl+w或Ctrl+u刪除的內容
提示符
mysql> #等待輸入命令 -> #續行 ‘> #還需補全後半部單引號 “> #還需補全後半部雙引號 `> #還需補全後半部反引號 /*> #註釋,不執行,需以*/結束註釋
SQL語言的組成部分
DDL:數據定義語言
DCL:數據控制語言,如授權
DML:數據操作語言
完整性定義語言:DDL功能性約束(主鍵、外鍵、惟一鍵、條件、非空、事務)
視圖定義:虛表,存儲下來的select語句
事務控制
數據字典
數據字典:系統編目(system catalog)
保存了數據庫服務器上的元數據
元數據
關係的名稱 每個關係中各字段的名稱 各字段的類型和長度 約束 每個關係上的視圖的名字及視圖的定義 授權的用戶名字 用戶的授權和帳戶信息 統計類數據 每個關係中字段數; 每個關係中行數; 每個關係的存儲方法;
保存元數據的數據庫
infomation_schema mysql performance_schema
數據類型及屬性修飾符
數據類型的功用
①存儲的值類型
②佔據的最大存儲空間
③定長、變長
④如何被索引和排序
⑤是否能夠被索引
數據類型
字符型
CHAR、VARCARH、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOG、LONGBLOB 修飾符: NULL:允許爲空 NOT NULL:不允許爲空 DEFAULT 'string':默認值,不適用於TEXT CHARACTER SET 'set':設定字符集 SHOW CHARACTER SET;查看可用字符集 COLLATION 'collation':設定字符集排序規則 SHOW COLLATION;查看可用排序規則 DEFAULT:不用於BLOB類型 字符有通配符: %: 匹配任意長度的任意字符 _: 匹配任意單個字符;
整型
TINYINT、SMALLINT、MEDIUMINT 、INT、BININT 修飾符: UNSIGNED:無符號 NULL NOT NULL DEFAULT AUTO_INCREMENT: 自動增長 #特殊要求:非空,且必須是主鍵或惟一鍵
浮點型
FLOAT、DOUBLE 修飾符: NOT NULL NULL DEFAULT UNSIGNED
布爾型
沒有專用布爾型,其是TINYINT(1)的別名
日期時間型
DATE、TIME、DATETIME、TIMESTAMP、YEAR(2)、YEAR(4) 修飾符: NULL NOT NULL DEFAULT VALUE
內建類型
ENUM:枚舉,表示僅能從給出的選項選擇其中一個 ENUM('string1','string2') SET:集合, 表示能使用給出的元素組合成字符串 SET('a','b','c') 修飾符: NULL NOT NULL DEFAULT ''
SQL模式及服務器變量
sql模式:用來限定mysqld的工作特性
TRADITIONAL:傳統模式
STRICT_TRANS_TABLES:對支持事務的表使用嚴格模式
STRICT_ALL_TABLES:對所有表使用嚴格模式
服務器變量的類型
全局:對所有會話都生效
所有的會話在建立時都從全局繼承,但繼承完成後每個會話獨立維護自己會話級變量
修改全局的服務器變量僅對之後建立的會話生效
要求有管理權限
會話:僅對當前會話有效
修改即刻生效
不要求管理權限
修改方式
動態修改: 會話級別,立即生效;全局級別,新建立的會話有效,重啓服務會失效
靜態修改:要修改配置文件,或修改傳遞給mysqld的選項的值,重啓後有效
注:並非所有的服務器變量都支持動態修改
查看服務器變量
mysql> SHOW {GLOBAL|SESSION} VARIABLES [LIKE clause]; mysql> SELECT @@{GLOBAL|SESSION}.VARIABLE_NAME; mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME=''; mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='';
修改服務器變量
動態修改變量的值: mysql> SET {GLOBAL|SESSION} VARIABLE_NAME='VALUE' 讓設置永久有效的方式: [mysqld] sql_mode = 'STRICT_ALL_TABLES'
語句書寫大小寫說明
①SQL關鍵字及函數名不區字符大小寫
②數據庫、表、索引及視圖的名稱是否區分大小寫取決於低層的OS及FS
③存儲過程、存儲函數及事件調度器不區分字符大小寫,但觸發器區分
④表別名不區分大小寫
⑤字段中字符數據,類型爲binary、blog、varbinary時區分大小寫,其它的不區分
DDL操作
數據庫操作
創建數據庫 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name 刪除數據庫 DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 修改數據庫 ALTER {DATABASE | SCHEMA} [IF EXISTS] db_name
表操作
創建表 CREATE TABLE [IF NOT EXISTS] tb_name (col1_def,col2_def,PRIMARY KEY(col_name,...),UNIQUE (col1,...),INDEX (col1,...)) [table_option] table_option: ENGINE [=] engine_name COMMENT [=] 'string' ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}] CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name #複製表數據 [(create_definition,...)] [table_options] select_statement CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name #複製表結構 { LIKE old_tbl_name | (LIKE old_tbl_name) } 刪除表 DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] #cascade會將有依賴關聯的表一併刪除 修改表 ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, alter_specification] ...] alter_specification: #插入新字段 ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ] #刪除字段 DROP [COLUMN] col_name #修改字段屬性 ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} #修改字段名 CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name] #修改字段類型及屬性等 MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name] 修改表名 ALTER TABLE tb_name RENAME TO new_tb_name; RENAME TABLE old_name TO new_name; #指定排序字段 ORDER BY col_name [, col_name] ... #轉換字符集及排序規則 CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
表結構之索引
索引:特殊的數據結構,用於快速找到數據記錄(行) 注:鍵可用作索引;並非所有索引都是鍵 索引類型:B-Tree (B+ Tree) (左前綴), hash (key-value), R-Tree, FullText 索引的優點: 大大減少服務器需要掃描的數據量 索引可以幫助服務器儘量避免進行排序及使用臨時表 索引可以將隨機I/O轉換爲順序I/O 索引可以創建在一個字段,也可是多個字段上:簡單索引、組合索引 例子:索引(姓名,性別) where name like 'tom%' where gender = 'female' where familyname = 'tom' and gender = 'female' B-Tree索引的適用場景: 全值匹配:比較操作符 =, <=> 左前綴匹配:LIKE 'tom%' 列前綴匹配 匹配範圍值: 組合索引類型中,精確匹配前一列,並範圍匹配後一列 只訪問索引的查詢:覆蓋索引,從索引就可以直接得到最終結果 哈希索引適用場景: 哈希索引只包含哈希值和行指針;不是按照索引值順序存儲,無法用於排序;不支持部分索引匹配查找 哈希索引只支持等值比較查詢,包含=, IN(), <=> 聚簇索引:索引和數據一起存放; 數據文件:索引順序文件 非聚簇索引:索引和數據分開存放,而數據記錄未必順序存放;但索引數據一般順序存放; 數據文件:堆文件 添加索引 ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option] ... CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ... 刪除索引 ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name DROP {INDEX|KEY} index_name DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name 查看索引 SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr] 索引創建的基本法則:基於搜索鍵來創建索引 SELECT的WHERE子句的查詢條件中的字段 索引的使用策略: 1、要使用獨立的列:索引列不是表達式的一部分; SELECT Name FROM students WHERE Age + 2 > 32; 2、前綴索引 索引選擇性:單獨的索引項與數據表中的記錄的總數的比值;取值範圍:1/n-1; books, book 3、多列索引 查詢條件多用AND,則建議使用多列索引; 查詢條件多用OR,建議使用多個簡單索引; 4、合適的次序:將選擇性高的列寫在最左側; (Name, Gender) 5、聚簇索引: 好處:數據訪問更快; 缺點:更新聚簇索引列的代價很高; 6、覆蓋索引 SELECT Name FROM students WHERE Name LIKE'tom%'; 7、避免冗餘索引 name, (name,gender)
The end
MySQL/MariaDB的知識就先說到這裏了,後續文章還會繼續講解MySQL/MariaDB的相關知識,有興趣可以繼續關注。以上僅爲個人學習整理,如有錯漏,大神勿噴~~~