MySQL是一個輕量級關係型數據庫管理系統,由瑞典MySQL AB公司開發,目前屬於Oracle公司。目前MySQL被普遍地應用在Internet上的中小型網站中,因爲體積小、速度快、整體擁有成本低,開放源碼、免費,通常中小型網站的開發都選擇Linux + MySQL做爲網站數據庫。
MySQL是一個關係型數據庫管理系統,MySQL是一種關聯數據庫管理系統,關聯數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,就增長了速度並提升了靈活性。
MySQL的官方網站的網址是:www.mysql.comphp
MySQL是一種使用普遍的數據庫,特性以下:
A、使用C和C++編寫,並使用了多種編譯器進行測試,保證源代碼的可移植性
B、支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操做系統。
C、爲多種編程語言提供了API。編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
D、支持多線程,充分利用CPU資源
E、優化的SQL查詢算法,有效地提升查詢速度
F、既可以做爲一個單獨的應用程序應用在客戶端服務器網絡環境中,也可以做爲一個庫而嵌入到其餘的軟件中提供多語言支持,常見的編碼如中文的GB 23十二、BIG5,日文的Shift_JIS等均可以用做數據表名和數據列名
G、提供TCP/IP、ODBC和JDBC等多種數據庫鏈接途徑
H、提供用於管理、檢查、優化數據庫操做的管理工具
I、能夠處理擁有上千萬條記錄的大型數據庫mysql
與大型數據庫例如Oracle、DB二、SQL Server等相比,MySQL自有它的不足之處,如規模小、功能有限(MySQL Cluster的功能和效率都相對比較差)等,可是這絲毫也沒有減小它受歡迎的程度。對於通常的我的使用者和中小型企業來講,MySQL提供的功能已經綽綽有餘,並且因爲MySQL是開放源碼軟件,所以能夠大大下降整體擁有成本。 目前Internet上流行的網站構架方式是LAMP(Linux+Apache+MySQL+PHP),即便用Linux做爲操做系統,Apache做爲Web服務器,MySQL做爲數據庫,PHP做爲服務器端腳本解釋器。因爲Linux+Apache+MySQL+PHP都是自由或開放源碼軟件(FLOSS),所以使用LAMP不用花一分錢就能夠創建起一個穩定、免費的網站系統。算法
可使用命令行工具管理MySQL數據庫(命令mysql 和 mysqladmin),也能夠從MySQL的網站下載圖形管理工具MySQL Administrator和MySQL Query Browser。
phpMyAdmin是由php寫成的MySQL資料庫系統管理程式,讓管理者可用Web界面管理MySQL資料庫。
phpMyBackupPro也是由PHP寫成的,能夠透過Web介面建立和管理數據庫。它能夠建立僞cronjobs,能夠用來自動在某個時間或週期備份MySQL 數據庫。
另外,還有其餘的GUI管理工具,例如早先的mysql-front以及ems mysql manager,navicat 等等。sql
MySQL 爲關係型數據庫(Relational Database Management System), 這種所謂的"關係型"能夠理解爲"表格"的概念, 一個關係型數據庫由一個或數個表格組成, 如圖所示的一個表格:數據庫
插件式存儲引擎是MySQL數據庫最重要的特性之一,用戶能夠根據應用的須要選擇如何存儲和索引數據庫,是否使用事務等。mySQL默認支持多種存儲引擎,以適應不一樣領域的數據庫應用須要。用戶能夠經過選擇使用不一樣的存儲引擎提升應用的效率,提供靈活的存儲,用戶設置能夠按照本身的須要定製和使用本身的存儲引擎,以實現最大程度的可定製性。
MySQL經常使用的存儲引擎爲MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事務安全表,其餘存儲引擎都是非事務安全表。
MyISAM是MySQL的默認存儲引擎。MyISAM不支持事務、也不支持外鍵,但其訪問速度快,對事務完整性沒有要求。
InnoDB存儲引擎提供了具備提交、回滾和崩潰恢復能力的事務安全。可是比起MyISAM存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。MySQL支持外鍵存儲引擎只有InnoDB,在建立外鍵的時候,要求附表必須有對應的索引,子表在建立外鍵的時候也會自動建立對應的索引。編程
主要體如今性能、事務、併發控制、參照完整性、緩存、故障恢復,備份及回存等幾個方面
目前比較普及的存儲引擎是MyISAM和InnoDB,而MyISAM又是絕大部分Web應用的首選。MyISAM與InnoDB的主要的不一樣點在於性能和事務控制上。
MyISAM是早期ISAM(Indexed Sequential Access Method)的擴展實現,ISAM被設計爲適合處理讀頻率遠大於寫頻率的狀況,所以ISAM以及後來的MyISAM都沒有考慮對事物的支持,不須要事務記錄,ISAM的查詢效率至關可觀,並且內存佔用不多。MyISAM在繼承了ISAM優勢的同時,與時俱進的提供了大量實用的新特性和相關工具。例如考慮到併發控制,提供了表級鎖。並且因爲MyISAM是每張表使用各自獨立的存儲文件(MYD數據文件和MYI索引文件),使得備份及恢復十分方便(拷貝覆蓋便可),並且還支持在線恢復。
因此若是應用不須要事務,不支持外鍵,處理的只是基本的CRUD(增刪改查)操做,那麼MyISAM是不二選擇。緩存
MySQL有三大類數據類型, 分別爲數字、日期\時間、字符串, 這三大類中又更細緻的劃分了許多子類型:安全
1)整數類型服務器
類型 | 字節數 | 範圍 |
---|---|---|
TNIYINT | 1 | -128~127 |
SMALLINT | 2 | -32767~32768 |
MEDIUMINT | 3 | -8388608~8388607 |
INT | 4 | -2147483648~2147483647 |
BIGINT | 8 | -9223372036854775808~9223372036854775807 |
2)實數類型網絡
類型 | 字節 | 備註 |
---|---|---|
FLOAT | 4 | 單精度浮點數 |
DOUBLE | 8 | 雙精度浮點數 |
DECIMAL | 可變 | 高精度定點數 |
3)字符串類型
VARCHAR vs CHAR
類型 | 最大長度 | 備註 |
---|---|---|
CHAR(size) | 255字節 | 定長。size指定的是字符數,不是字節數。 |
VARCHAR(size) | 65532字節 | 變長。size指定的是字符數,不是字節數。 |
適用VARCHAR:
適用CHAR:
CHAR類型的列,原字符串末尾的空格會被「幹掉」,再填充空格。MySQL檢索CHAR不會使用末尾的空格。(列是定長的,MySQL沒有存儲寫入的字符串有多長,只好一刀切,末尾的空格都忽略掉。)
VARCHAR末尾的空格不會被「幹掉」,檢索的時候會用到。(MySQL存儲了寫入的字符串的長度,這樣能夠知道字符串末尾有多少各空格是你寫入的。)
VARCHAR(5)和VARCHAR(200),若是都只存了"abc",它們有什麼不一樣呢?實際上,MySQL會分配固定大小地內存塊來保存內部值,所以VARCHAR(200)的列儘管只存了和VARCHAR(5)同樣的字符串,可是分配的內存可能會大得多。
BINARY vs VARBINARY
類型 | 最大長度 | 備註 |
---|---|---|
BINARY | 255 | 定長 |
VARBINARY | 65535 | 變長 |
BLOB vs TEXT
L表示數據的長度。
L+x表示存儲須要的空間。
類型 | 存儲 |
---|---|
TINYBLOB | L+1 bytes, L < 2^8 |
SMALLBLOB/BLOB | L+2 bytes, L < 2^16 |
MEDIUMBLOB | L+3 bytes, L < 2^24 |
LONGBLOB | L+4 bytes, L < 2^32 |
TINYTEXT | L+1 bytes, L < 2^8 |
SMALLTEXT/TEXT | L+2 bytes, L < 2^16 |
MEDIUMTEXT | L+3 bytes, L < 2^24 |
LONGTEXT | L+4 bytes, L < 2^32 |
4)日期和時間類型
5)一些原則
通常狀況下,應該儘可能使用能夠正確存儲數據的最小數據類型。
簡單就好。
好比,用MySQL的內建類型date, time, datetime來存儲時間,而不是使用字符串;用INT UNSIGNED來存儲IPv4地址。
如何存儲IPv6的地址?IPv6地址128bit,MySQL最大的整數類型BIGINT只有64bit。能夠將其存儲成定長(16字節)的二進制字符?
鏈接層
通信協議的處理、線程處理、網絡權限、帳號認證等
處理層
權限處理、結果緩存(Query cache)、查詢解析、優化器、查詢執行、返回等
存儲層
用於持久化處理層的數據,innodb、MyISAM、Memory、Heap
實例
由數據庫後臺進程/線程以及一個共享區域組成(程序的概念),數據庫實例是用來操做數據庫文件的
數據庫
數據庫(數據庫文件)是一個或者一組二進制文件,一般來講存在與文件系統之上
單進程多線程結構
不會影響MySQL的性能,看程序如何寫。(多進程程序,進程間通訊開銷大於多線程)
存儲引擎的概念
能夠理解成文件系統,例如FAT32, NTFS, EXT4。 一個表是一個分區,引擎就是分區的文件系統
存儲引擎的對象就是表
邏輯存儲結構
instance
database
schema
tablespace
table
MySQL配置文件
my.cnf
表結構的組成
表結構定義文件:frm
innodb數據文件:ibd
MyISAM數據文件:myi
共享表空間文件:ibdata*
error log(錯誤日誌)
error_log
binary log(二進制日誌)
記錄數據庫寫入操做的日誌,能夠用於備份恢復後者是master/slave 的複製
log_bin
log_bin_index
log_bin_basename
slow query log(慢日誌)
將運行超過某一個時間戳的閾值的SQL語句記錄到文件
slow_query_log
slow_launch_time
slow_query_log_file
general log(常規日誌也叫全量日誌)
開啓後將記錄全部連接到MySQL任何的操做
general_log
general_log_file
relay-log(中繼日誌)
io_thread 從master讀到的日誌寫到中繼日誌中,供sql_thread執行完,已完成複製成功
relay_log=relay-bin
innodb redo log 5.6以前redo log 個數總大小不能超過4G 5.6.以前redo log的大小不能更改,變動後數據器啓動失敗 innodb_log_group_home_dir=/data01/mysql/mysql3306/logs innodb_log_file_size=200M innodb_log_files_in_group=3