1、基本介紹:mysql
MySQL是一款開源的關係數據庫管理系統,最先有瑞典的MySQL AB公司開發,2008年被SUN公司收購,2009年,SUN公司被Oracle公司收購。MySQL性能高、成本低、安全穩定,被普遍應用在中小型網站中,隨着MySQL的性能不斷提升,像維基百科、Google、Facebook等大公司也正在使用MySQL(維基百科如今以遷移到MariaDB)。sql
MySQL使用C和C++編寫,併爲多種語言提供了API,支持多線程,充分利用CPU資源,支持多用戶,提供TCP/IP/、ODBC和JDBC等等多種數據庫鏈接途徑,且提供了用於管理、檢查、優化數據庫操做的管理工具,能夠處理擁有上千萬條記錄的大型數據庫。shell
2、MySQL體系結構:數據庫
一、Connectors指的是不一樣語言中與SQL的交互apache
二、Management Serveices & Utilities: 系統管理和控制工具vim
三、Connection Pool: 鏈接池緩存
管理緩衝用戶鏈接,線程處理等須要緩存的需求。安全
四、SQL Interface: SQL接口bash
接受用戶的SQL命令,而且返回用戶須要查詢的結果。好比select from就是調用SQL Interface。服務器
五、Parser: 解析器。
SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的腳本。
主要功能:
a . 將SQL語句分解成數據結構,並將這個結構傳遞到後續步驟,之後SQL語句的傳遞和處理就是基於這個結構的 。
b. 若是在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的。
六、Optimizer: 查詢優化器
SQL語句在查詢以前會使用查詢優化器對查詢進行優化。他使用的是「選取-投影-聯接」策略進行查詢。
用一個例子就能夠理解: select uid,name from user where gender = f;
這個select 查詢先根據where 語句進行選取,而不是先將表所有查詢出來之後再進行gender過濾。
這個select查詢先根據uid和name進行屬性投影,而不是將屬性所有取出之後再進行過濾。
將這兩個查詢條件聯接起來生成最終查詢結果。
七、Cache和Buffer: 查詢緩存
若是查詢緩存有命中的查詢結果,查詢語句就能夠直接去查詢緩存中取數據。
這個緩存機制是由一系列小緩存組成的。好比表緩存,記錄緩存,key緩存,權限緩存等。
八、Engine :存儲引擎
存儲引擎是MySql中具體的與文件打交道的子系統。也是Mysql最具備特點的一個地方。
Mysql的存儲引擎是插件式的。它根據MySql AB公司提供的文件訪問層的一個抽象接口來定製一種文件訪問機制(這種訪問機制就叫存儲引擎)。
如今有不少種存儲引擎,各個存儲引擎的優點各不同,最經常使用的MyISAM,InnoDB,BDB。
默認下MySql是使用MyISAM引擎,它查詢速度快,有較好的索引優化和數據壓縮技術。可是它不支持事務。
InnoDB支持事務,而且提供行級的鎖定,應用也至關普遍。
Mysql也支持本身定製存儲引擎,甚至一個庫中不一樣的表使用不一樣的存儲引擎,這些都是容許的。
後面我會詳細介紹這些引擎各自的特性。
從上圖咱們換個角度(微觀)來解析一下它:
一、鏈接管理器:
當客戶發起請求後由鏈接管理器負責接收這個請求;
二、線程管理器:
MySQL是以單進程多線程的方式運做的,因而它將會爲每個用戶生成一個線程
三、用戶模塊
它的做用是進行身份進行認證,管理用戶,一旦訪問完成後,退出了,線程就會被線程管理器回收到鏈接池中;其實用戶最終要用戶模塊打交道,只有第一次剛剛發起鏈接時才須要認證;後續的SQL語句都與用戶模塊打交道,而再也不是鏈接管理器了;
四、命令派發器:
一旦用戶認證經過鏈接進來後它會將那些SQL語句派發到:
"查詢緩存",若是查詢緩存一旦命中,那麼結果也就直接返回客戶端;
"日誌記錄",一旦咱們開啓了查詢日誌,待咱們查詢完成後須要將執行操做記錄日誌;
五、分析器:
若是上面的由命令派發到查詢緩存沒有命中,那麼命令派發器會將SQL語句轉交給分析器,由分析器進行SQL語句分析;這些語句有可能包含:DML、DDL,這些不一樣的語句就須要有不一樣的機制來處理;
優化器:分析器分析出這是一條查詢語句那麼由優化器來負責處理;SELECT
表修改模塊:若是是更新或修改表中數據的操做,則由表修改模塊負責;UPDATE/INSET/DELETE/REPLACE.....
表維護模塊:若是表須要修復則由表維護模塊負責;
複製模塊:若是分析出是表或數據複製操做,則有複製模塊操做;Replication(要啓用該模塊功能才起做用)
狀態報告模塊:優化器之因此可以完成優化,它是根據Mysql服務器不斷收集狀態信息得來的,因此由此模塊負責狀態報告;
6.訪問控制模塊:
上面的用戶認證受權經過後並不意味着就有權限訪問任意數據,這裏經過訪問控制模塊再次對權限進行檢查;
7.表管理器
若是訪問控制檢查經過,真正執行操做則有表管理器來負責,不管是增刪查改等這樣的語句;
8.存儲引擎
表管理器執行操做則會經過它的內部接口,這個操做要依賴於存儲引擎; 存儲引擎這個抽象接口將用戶請求轉交給各個對應使用的存儲引擎,完成操做最終將其結果返回客戶端。
OK,瞭解了MySQL的基本體系架構後咱們嘗試安裝一下吧,咱們知道安裝mysql的方式有三種:二進制源碼包安裝、RPM包安裝以及編譯安裝前面的那些試驗當中也演示到了二進制源碼和rpm包安裝,這裏我將採用源碼包的方式安裝:
說明:
MySQL從5.5版本開始,經過./configure進行編譯配置方式已經被取消,取而代之的是cmake工具。
所以,咱們首先要在系統中源碼編譯安裝cmake工具,我這裏使用的cmake版本爲cmake-2.8.10.2,mysql爲5.5.36
注意:開發環境
1.獲取cmake,安裝之
[root@mysql ~]# wget http://down1.chinaunix.net/distfiles/cmake-2.8.10.2.tar.gz [root@mysql ~]# tar -xf cmake-2.8.10.2.tar.gz -C /usr/src/ [root@mysql ~]# cd /usr/src/cmake-2.8.10.2/ [root@mysql cmake-2.8.10.2]# ./configure
2. 安裝mysql前的系統設置
創建mysql安裝目錄及數據存放目錄
安裝路徑:
[root@mysql ~]# mkdir /usr/local/mysql
數據庫路徑:
[root@mysql ~]# mkdir /data/mysql #建議此目錄掛載至LVM上面,這樣對於後期的擴容有很大的幫助!
建立用戶和用戶組
[root@mysql ~]#groupadd mysql [root@mysql ~]#useradd -g mysql mysql
賦予數據存放目錄權限
[root@mysql ~]# chown mysql:mysql -R /data/mysql
3.編譯安裝 MySQL 5.5
經過http://www.mysql.com/downloads/mysql官方網址或國內的sohu鏡像下載軟件包.
[root@mysql ~]# wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.36.tar.gz [root@mysql ~]# cd /usr/src/ [root@mysql src]# ln -sv mysql-5.5.36 mysql `mysql' -> `mysql-5.5.36' [root@mysql ~]# cd mysql [root@mysql mysql]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/mydata/data \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci [root@mysql ~]# make && make install
在make與make install的時候能夠看到進度百分比,感受這一點要比configure方式要好。
參數說明:
指定安裝文件的安裝路徑時經常使用的選項:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc
默認編譯的存儲引擎包括:csv、myisam、myisammrg和heap。若要安裝其它存儲引擎,可使用相似以下編譯選項:
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1
若要明確指定不編譯某存儲引擎,可使用相似以下的選項:
-DWITHOUT_<ENGINE>_STORAGE_ENGINE=1
好比:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGINE=1
如若要編譯進其它功能,如SSL等,則可以使用相似以下選項來實現編譯時使用某庫或不使用某庫:
-DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0
其它經常使用的選項:
-DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_DEBUG=0 -DENABLE_PROFILING=1
若是想清理此前的編譯所生成的文件,則須要使用以下命令:
make clean rm CMakeCache.txt
在make與make install的時候能夠看到進度百分比,感受這一點要比configure方式要好。
首先說一下mysql主配置文件的特色(按如下序號次序來尋找)
1 /etc/my.cnf 集中式配置文件,爲多個命令提供配置 2 /etc/mysql/my.cnf 3 $MYSQL_HOME/my.cnf 4 /path/to/file when defaults-extra-file=/path/to/file is specified 5 ~/.my.cnf
若是發現多個配置文件, MySQL會將全部的配置文件組合起來,將他們的合合集做爲配置文件來使用 。若是配置出現衝突,則以讀取最後一個配置文件中的配置爲準。
若是啓動服務的時候想不使用默認的數據存放目錄,須要在初始化的時候使用datadir指令來定義。
讓mysql服務啓動的時候讀取額外的配置文件:
mysqld_safe --defaults-extra-file=/etc/mysql/my_instance.cnf。
將源碼安裝的apache的二進制文件的路徑加入環境變量中,並經過source對文件重讀:
[root@mysql mysql]# vim /etc/profile.d/mysqld.sh export PATH=$PATH:/usr/local/mysql/bin:PATH [root@mysql mysql]# source /etc/profile.d/mysqld.sh
將源碼安裝的mysql的頭文件導入到系統找獲得的位置:
[root@mysql mysql]# mkdir /usr/local/include/mysql [root@mysql mysql]# ln -sv /usr/local/mysql/include /usr/local/include/mysql /usr/local/include/mysql/include' -> `/usr/local/mysql/include' [root@mysql mysql]#
將源碼安裝的apache的庫文件導出給系統找獲得的位置:
[root@mysql mysql]# vim /etc/ld.so.conf.d/mysqld.conf /usr/local/mysql/lib #加入此行
將源碼安裝的apache的man手冊的導入系統找獲得的位置:
[root@mysql mysql]# vim /etc/man.config MANPATH /usr/local/mysql/man
建立my.cnf配置文件
[root@mysql mysql]# cp support-files/my-large.cnf /etc/my.cnf cp: overwrite `/etc/my.cnf'? y [root@mysql mydata]# vim /etc/my.cnf datadir = /data/mydata #加入此行
執行初始化腳本對數據庫進行初始化:
[root@mysql mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mydata/
建立管理MySQL數據庫的shell腳本
[root@mysql mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@mysql mysql]# chmod +x /etc/rc.d/init.d/mysqld
添加爲開機自啓動項
[root@mysql mysql]# chkconfig --add mysqld [root@mysql mysql]# chkconfig mysqld on
啓動mysql
[root@mysql mysql]# service mysqld start Starting MySQL.. [ OK ] [root@mysql mysql]# netstat -an | grep :3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN [root@mysql mysql]#
ok!至此咱們源碼包編譯安裝操做已經完成,接下來就是對他進行簡單配置便可:
在mysql安裝完以後,要作的第一件事就是爲管理員帳戶設定密碼,並刪除兩個匿名用戶;通常mysql安裝完成以後會生成三個管理員用戶帳號,和兩個匿名用戶帳號。
四個個管理員用戶帳號:
root@127.0.0.1 root@localhost root@hostname root@::1
兩個匿名用戶帳號:
''@localhost ''@hostname
刪除全部匿名用戶
mysql> DROP USER ''@'localhost'; mysql> DROP USER ''@'www.magedu.com';
用戶賬號由兩部分組成:username@hostname
host還可使用通配符:
%: 任意長度的任意字符
_: 匹配任意單個字符
給全部的root用戶設定密碼:
第一種方式:
mysql> SET PASSWORD FOR username@hostname = PASSWORD('your_passwrod');
第二種方式:
mysql> UPDATE user SET password = PASSWORD('your_password') WHERE user = 'root'; mysql> FLUSH PRIVILEGES;
第三種方式:
# mysqladmin -uUserName -hHost password 'new_password' -p # mysqladmin -uUserName -hHost -p flush-privileges
連入MySQL服務器
mysql client <--mysql protocol--> mysqld
mysqld接收鏈接請求:
本地通訊:客戶端與服務器端位於同一主機,並且還要基於127.0.0.1(localhost)地址或lo接口進行通訊;
遠程通訊:客戶端與服務器位於不一樣的主機,或在同一主機便使用非迴環地址通訊
客戶端工具:mysql, mysqladmin, mysqldump, mysqlcheck
幫助信息: -? -I --help ********************************************************** (單字符後面不帶空格) --user,-u 指定用戶訪問mysqld --host,-h 指定服務器的名字 --password,-p --protocol 指定鏈接協議(tcp/socket/pipe/memory) 使用--protocol socket時,本地客戶端是經過/tmp/mysql.sock(sock文件位置可能不一樣)鏈接本地mysqld服務 --port 遠程服務器的鏈接端口 --socket -D db_name 直接使用某個數據庫做爲默認數據庫 --datebase=... --compress 數據在服務器端和客戶端之間壓縮傳輸 --default-character-set=charset_name 指定字符集 -V 顯示版本號 -v命令執行時顯示詳細信息 --ssl-ca=/path/to/ssl_ca_file證書存放位置 (爲了驗證對方的證書) --ssl-capath=/path/to/ca_dir證書目錄 --ssl-cert=/path/to/cert_file//本身的證書 --ssl-cipher=cipher_list 加密方式 --ssl-key=/path/to/key_file本身的私鑰 --ssl-verify-server-cert 驗證服務器證書
mysql -e 不登錄mysql直接執行命令
[root@mysql ~]# mysql -e 'SHOW DATABASES;' +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ [root@mysql ~]#
mysqladmin經常使用選項:
create 建立數據庫 drop 刪除數據庫 debug 用於輸出調試信息 status 顯示全局變量和他的值 --sleepn 每一個n秒顯示一次 --count n 一共顯示n次 例如:#mysqladmin --sleep 3 --count 3 status extended-status 顯示全部系統變量和值/運行狀態屬性信息 flush-hosts 清空hosts內部信息 flush-logs 作二進制日誌滾動 flush-privileges 刷新 flush-status 從新開始計數 flush-tables 關閉表 flush-threads 重置線程緩存池 kill結束某個客戶端線程 processlist 列舉全部的進程和線程 password 爲某用戶設置密碼 ping查看是否處於運行狀態 reload flush-privilege refresh flush-hosts&flush-logs shutdown關閉指定mysql服務器 start-slave 啓動從服務器 stop-slave variables 顯示全局變量
mysql的快捷鍵:
Ctrl + w: 刪除光標以前的單詞 Ctrl + u: 刪除光標以前至命令行首的全部內容 Ctrl + y: 粘貼使用Ctrl+w或Ctrl+u刪除的內容 Ctrl + a: 移動光標至行首 Ctrl + e: 移動光標至行尾
數據類型的功用:
一、存儲的值類型; 二、佔據的礁存儲空間; 三、定長,變長; 四、如何被索引及排序; 五、是否可以被索引;
SQL語言組成部分:
DDL:數據庫定義語言 DML: 完整性定義語言:DDL的一部分功能 主鍵、外鍵、唯一鍵、條件、非空、事務 視圖定義:虛表,存儲下來的SELECT語句 事務控制 嵌入式SQL和動態SQL DCL:受權
數據字典:系統編目(system catalog, )
保存數據庫服務器上的元數據(非數據自己沒有關係,可是能夠經過其管理數據)
初始化mysql後生成的"mysql"
元數據: 關係的名字 每一個關係的各字段的名字 各字段的數據類型和長度 約束 每一個關係上的視圖的名字及視圖的定義 受權用戶的名字 用戶受權和帳戶信息 統計類的數據 每一個關係字段的個數 每一個關係中行數 每一個關係的存儲方法 保存原數據的數據庫: information_schema performance_schema (相似於Linux文件系統中的proc)
3、mysql數據類型:
1.經常使用數據類型:
數值型:
整型(5種)
TINYINT
SMALLINT
MEDIUMINT
INT (大於前面的)
BIGINT
十進制定點數
DESCIMAL
單精度浮點數:
FLOAT
雙精度浮點數
DOUBLE
位:按位存儲
BIT
字符型
===========================
做爲非二進制對象存儲<不區分大小寫>
CHAR(定長), VARCHAR(變長)
TINYTEXT, TEXT, MEDIUTEXT, LONGTEXT
===========================
++++++++++++++++++++++++++++
做爲二進制對象存儲<區分大小寫.沒有字符集>
BINARY(0-255定長),
VARBINARY(65535變長)
TINYBLOB(Up to 255 bytes, 1bytes overhead)
BLOB(Up to 64 kb, 2bytes overhead)
MEDIUMBLOB(Up to 16M, 3bytes overhead)
LONGBLOB(Up to 4Gb, 4bytes overhead)
++++++++++++++++++++++++++++
日期時間型
2.經常使用修飾符
1)、字符串經常使用修飾符:只修飾字符型,不修飾二進制型
CHAR,VARCHAR和TEXT字符型經常使用的屬性修飾符: 1.NOT NULL:非空約束 2.NULL:容許 3.DEFAULT'string'默認值,僅用於char,varchar不適用於TEXT類型 4.CHARACTER SET '字符集' mysql>SHOW VARIABLES LIKE '%char%' 當前系統上的字符集 mysql>SHOW CHARACTER SET 查看全部支持的字符集 默認狀況下若是沒有指定字符集它會去繼承表的,若是表也沒有指,就會繼承庫的,若是庫也沒有指,那麼會繼承服務器的。 5.COLLATION '規則' 查看本機上面排序規則 mysql>SHOW COLLATION; BINARY,VARBINARY和BLOB只用三種修飾符(NULL, NOT NULL, DEFAULT:不適用於BLOB) 內置類型 ENUM 存儲的值字串 SET 集合,存儲的是組合索引 修飾符:NOT NULL NULL DEFAULT 'string'
2)、整型常見的修飾符
整型的經常使用屬性修飾符: AUTO_INCREMENT:自動增加(前提:非空、且惟一;支持索引, 非負值) 批量插入的反作用:一次插入多行數據時,僅記錄第一個值 經過mysql>SELECT LAST_INSERT_ID();查看增加值,顯示結果並不是精確 mysql>TRUNCATE tb_name UNSIGNED:無符號 mysql>LAST_INSERT_ID();顯示結果並不是精確 mysql>TURNCATE tb_name; 浮點型經常使用屬性修飾符 NULL NOT NULL DEFAULT UNSINGNED
任何字符型必須加引號,任何數值型不能加!
3)、日期時間型的修飾符
NOT NULL NULL DEFAULT
4、SQL 模式:
TRADITIONAL 傳統模式 STRICT_TRANS_TABLES 僅對支持事務的表,嚴格模式 STRICT_ALL_TABLES 對全部表都是用嚴格模式
系統默認使用的是空模式
設定服務器變量的值:(僅於支持動態的變量)
支持修改的服務器變量
動態變量
能夠在Mysql運行是修改
靜態變量
在配置文件中修改其值,並重啓後方能修改
服務器變量從其生效範圍來說,有兩類:
全局變量:服務器級別,修改以後僅對新創建的會話有效
會話變量:會話級別,僅對當前會話有效;會話創建時,從全局繼承各變量
查看服務器變量三種方式:
mysql>SHOW [{GLOBAL|SESSION}] VARIABLES [LIKE '']; mysql>SETLECT @@{GLOBAL|SESSION}.sql_mode; mysql>SETLECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';
修改變量:前提:默認僅管理員有權限修改全局變量
mysql> SET {GLOBAL|SESSION} VARIABLE_NAME='VALUE';
注意:不管是全局仍是會話級別的動態變量修改,在重啓mysqld後都會失效;想永久有效,可定義在配置文件中的[mysqld]段落中!
5、Mysql中字符大小寫:
1.SQL關鍵字及函數名不區分字符大小寫;要麼大寫、要麼小寫
2.數據庫、表以及視圖名稱的大小寫區分與否取決於底層OS及File System;
3.存儲過程、存儲函數及時間調度器的名稱不區分大小寫,但觸發器區分;
4.表的別名區分大小寫
5.對於字段中的數據,若是字段類型爲Binary類型,則區分大小寫,非Binary不區分大小寫;