MySQL---一、介紹

1、MySQL簡介

一、MySQL簡介

MySQL是一個輕量級關係型數據庫管理系統,由瑞典MySQL AB公司開發,目前屬於Oracle公司。目前MySQL被普遍地應用在Internet上的中小型網站中,因爲體積小、速度快、整體擁有成本低,開放源碼、免費,通常中小型網站的開發都選擇Linux + MySQL做爲網站數據庫。
MySQL是一個關係型數據庫管理系統,MySQL是一種關聯數據庫管理系統,關聯數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,就增長了速度並提升了靈活性。
MySQL的官方網站的網址是:www.mysql.comphp

二、MySQL特性

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

三、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數據庫(命令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), 這種所謂的"關係型"能夠理解爲"表格"的概念, 一個關係型數據庫由一個或數個表格組成, 如圖所示的一個表格:數據庫

  • 表頭(header): 每一列的名稱;
  • 列(row): 具備相同數據類型的數據的集合;
  • 行(col): 每一行用來描述某我的/物的具體信息;
  • 值(value): 行的具體信息, 每一個值必須與該列的數據類型相同;
  • 鍵(key): 表中用來識別某個特定的人\物的方法, 鍵的值在當前列中具備惟一性。

2、MySLQ存儲引擎

一、MySQL存儲引擎簡介

插件式存儲引擎是MySQL數據庫最重要的特性之一,用戶能夠根據應用的須要選擇如何存儲和索引數據庫,是否使用事務等。mySQL默認支持多種存儲引擎,以適應不一樣領域的數據庫應用須要。用戶能夠經過選擇使用不一樣的存儲引擎提升應用的效率,提供靈活的存儲,用戶設置能夠按照本身的須要定製和使用本身的存儲引擎,以實現最大程度的可定製性。
MySQL經常使用的存儲引擎爲MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事務安全表,其餘存儲引擎都是非事務安全表。
MyISAM是MySQL的默認存儲引擎。MyISAM不支持事務、也不支持外鍵,但其訪問速度快,對事務完整性沒有要求。
InnoDB存儲引擎提供了具備提交、回滾和崩潰恢復能力的事務安全。可是比起MyISAM存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。MySQL支持外鍵存儲引擎只有InnoDB,在建立外鍵的時候,要求附表必須有對應的索引,子表在建立外鍵的時候也會自動建立對應的索引。編程

二、MySQL存儲引擎特性

主要體如今性能、事務、併發控制、參照完整性、緩存、故障恢復,備份及回存等幾個方面
目前比較普及的存儲引擎是MyISAM和InnoDB,而MyISAM又是絕大部分Web應用的首選。MyISAM與InnoDB的主要的不一樣點在於性能和事務控制上。
MyISAM是早期ISAM(Indexed Sequential Access Method)的擴展實現,ISAM被設計爲適合處理讀頻率遠大於寫頻率的狀況,所以ISAM以及後來的MyISAM都沒有考慮對事物的支持,不須要事務記錄,ISAM的查詢效率至關可觀,並且內存佔用不多。MyISAM在繼承了ISAM優勢的同時,與時俱進的提供了大量實用的新特性和相關工具。例如考慮到併發控制,提供了表級鎖。並且因爲MyISAM是每張表使用各自獨立的存儲文件(MYD數據文件和MYI索引文件),使得備份及恢復十分方便(拷貝覆蓋便可),並且還支持在線恢復。
因此若是應用不須要事務,不支持外鍵,處理的只是基本的CRUD(增刪改查)操做,那麼MyISAM是不二選擇。緩存

3、MySLQ數據類型

一、常見

MySQL有三大類數據類型, 分別爲數字、日期\時間、字符串, 這三大類中又更細緻的劃分了許多子類型:安全

  • 數字類型
    • 整數: tinyint、smallint、mediumint、int、bigint
    • 浮點數: float、double、real、decimal
  • 日期和時間: date、time、datetime、timestamp、year
  • 字符串類型
    • 字符串: char、varchar
    • 文本: tinytext、text、mediumtext、longtext
    • 二進制(可用來存儲圖片、音樂等):bit, tinyblob、blob、mediumblob、longblob

二、詳細

1)整數類型服務器

類型 字節數 範圍
TNIYINT 1 -128~127
SMALLINT 2 -32767~32768
MEDIUMINT 3 -8388608~8388607
INT 4 -2147483648~2147483647
BIGINT 8 -9223372036854775808~9223372036854775807
  • 每一個整數類型都有對應的無符號(UNSIGNED)類型。
  • 建議使用TINYINT代替ENUM。
  • 避免使用整數的顯示寬度。

2)實數類型網絡

類型 字節 備註
FLOAT 4 單精度浮點數
DOUBLE 8 雙精度浮點數
DECIMAL 可變 高精度定點數
  • DECIMAL只是一種存儲格式,MySQL以二進制的合適存儲DECIMAL類型的列。在計算中,DECIMAL會轉換成DOUBLE。
  • 不建議指定浮點數的精度。
  • 不建議使用DECIMAL。
  • 建議要存儲的實數乘以相應的倍數,使用整數類型運算和存儲。

3)字符串類型

VARCHAR vs CHAR

類型 最大長度 備註
CHAR(size) 255字節 定長。size指定的是字符數,不是字節數。
VARCHAR(size) 65532字節 變長。size指定的是字符數,不是字節數。
  • 適用VARCHAR:

    • 字符串地最大長度比平均長度大不少;
    • 列更新不多,因此碎片不是問題;
    • 使用像UTF8這樣複雜地字符集,每一個字符均可能使用不一樣的字節數進行存儲。
  • 適用CHAR:

    • 短字符串;
    • 全部值都接近一個長度;
    • 常常變動的列,這樣不易產生碎片;
  • CHAR類型的列,原字符串末尾的空格會被「幹掉」,再填充空格。MySQL檢索CHAR不會使用末尾的空格。(列是定長的,MySQL沒有存儲寫入的字符串有多長,只好一刀切,末尾的空格都忽略掉。)

  • VARCHAR末尾的空格不會被「幹掉」,檢索的時候會用到。(MySQL存儲了寫入的字符串的長度,這樣能夠知道字符串末尾有多少各空格是你寫入的。)

  • VARCHAR(5)和VARCHAR(200),若是都只存了"abc",它們有什麼不一樣呢?實際上,MySQL會分配固定大小地內存塊來保存內部值,所以VARCHAR(200)的列儘管只存了和VARCHAR(5)同樣的字符串,可是分配的內存可能會大得多。

BINARY vs VARBINARY

類型 最大長度 備註
BINARY 255 定長
VARBINARY 65535 變長
  • BINARY和VARBINARY與CHAR和VARCHAR很是相似。
  • BINARY和VARBINARY存儲的是二進制字符串,與字符集無關。
  • BINARY的末尾會被填充\0,而且會加入檢索。

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
  • BLOB系列存儲二進制字符串,與字符集無關。
  • TEXT系列存儲非二進制字符串,與字符集相關。
  • 通常狀況下,你能夠認爲BLOB是一個更大的VARBINARY;TEXT是一個更大的VARCHAR。
  • MySQL只能對BLOB和TEXT的前面max_sort_length各字符進行排序和索引。
  • BLOB和TEXT都不能有default value。
  • 當BLOB和TEXT的長度太大時,InnoDB會使用專門的「外部」存儲區域來進行存儲。

4)日期和時間類型

5)一些原則

  • 選擇最小的知足需求的數據類型。

通常狀況下,應該儘可能使用能夠正確存儲數據的最小數據類型。
簡單就好。

好比,用MySQL的內建類型date, time, datetime來存儲時間,而不是使用字符串;用INT UNSIGNED來存儲IPv4地址。

如何存儲IPv6的地址?IPv6地址128bit,MySQL最大的整數類型BIGINT只有64bit。能夠將其存儲成定長(16字節)的二進制字符

  • 儘可能避免使用NULL。

四.MySQL體系結構簡介

4.1.MySQL邏輯概念

圖片來自網絡
  • 鏈接層
    通信協議的處理、線程處理、網絡權限、帳號認證等

  • 處理層
    權限處理、結果緩存(Query cache)、查詢解析、優化器、查詢執行、返回等

  • 存儲層
    用於持久化處理層的數據,innodb、MyISAM、Memory、Heap

4.2.MySQL存儲結構

  • 實例
    由數據庫後臺進程/線程以及一個共享區域組成(程序的概念),數據庫實例是用來操做數據庫文件的

  • 數據庫
    數據庫(數據庫文件)是一個或者一組二進制文件,一般來講存在與文件系統之上

  • 單進程多線程結構
    不會影響MySQL的性能,看程序如何寫。(多進程程序,進程間通訊開銷大於多線程)

  • 存儲引擎的概念
    能夠理解成文件系統,例如FAT32, NTFS, EXT4。 一個表是一個分區,引擎就是分區的文件系統
    存儲引擎的對象就是表

  • 邏輯存儲結構
    instance
    database
    schema
    tablespace
    table

4.3.MySQL文件結構

圖片來自原創
  • 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

相關文章
相關標籤/搜索