本文介紹MySQL版本
一、MySQL各版本
1.MySQL産品
下載下傳位址:https://www.mysql.com/downloads/
Oracle MySQL Cloud Service(commercial)
商業付費軟體,基于MySQL企業版和Oracle雲服務提供企業級的MySQL資料庫服務。
MySQL Enterprise Edition (commercial)
商業付費軟體,提供以下服務
- MySQL Database(MySQL資料庫)
- MySQL Storage Engines (InnoDB, MyISAM, etc.) (MySQL存儲引擎)
- MySQL Connectors (JDBC, ODBC, .Net, etc.) (MySQL連接配接器)
- MySQL Replication (MySQL複制)
- MySQL Partitioning (MySQL分區)
- MySQL Utilities (MySQL實用程式)
- MySQL Workbench (MySQL模組化工具)
- MySQL Enterprise Backup (MySQL企業備份)
- MySQL Enterprise Monitor (MySQL企業螢幕)
- MySQL Enterprise HA (MySQL企業高可用)
- MySQL Enterprise Security (MySQL企業安全)
- MySQL Enterprise Transparent Data Encryption (TDE) (MySQL企業透明資料加密)
- MySQL Enterprise Firewall (MySQL企業防火牆)
- MySQL Enterprise Encryption (MySQL企業加密)
- MySQL Enterprise Audit (MySQL企業審計)
MySQL Cluster CGE (commercial)
商業付費軟體,基于MySQL Cluster和企業版擁有的各項功能提供企業級的高并發、高吞吐的資料庫服務。
MySQL Community Edition (GPL)
免費社群軟體,提供基礎的資料庫服務和其他衍生服務。
2.MySQL社群産品服務
下載下傳位址:https://dev.mysql.com/downloads/
MySQL Community Server (GPL)
MySQL社群服務是世界上最流行的開源資料庫。
MySQL Cluster (GPL)
MySQL叢集是一個實時的、開放源碼的事務資料庫。基于MySQL資料庫而實作的叢集服務,自身提供高并發高負載等特性。
MySQL Router (GPL)
MySQL路由器是輕量級的中間件,可以在您的應用程式和任何後端MySQL伺服器之間提供透明的路由。
MySQL Utilities (GPL)
MySQL實用程式提供了用于維護和管理MySQL伺服器的指令行實用程式的集合。
MySQL Shell (GPL)
是一個互動式的Javascript、Python或sql接口,支援的開發和管理MySQL服務,是MySQL服務的一個元件。
MySQL Workbench (GPL)
是一個下一代可視化資料庫設計應用程式,可以用來高效地設計、管理和記錄資料庫模式。它既是開源的,也是商業版的。
MySQL Connectors
MySQL連接配接器提供了标準的資料庫驅動程式連接配接,以便使用與工業标準ODBC和jdbc相容的應用程式和工具。
MySQL on Windows (Installer & Tools)
為您提供了一套工具,用于開發和管理基于windows的MySQL業務關鍵應用程式。
MySQL Yum Repository
提供了一個Yum軟體庫,用于簡化在各種linux作業系統上安裝和更新MySQL産品。
MySQL APT Repository
MySQL provides an APT-style software repository for installing the MySQL server, client, and other components on a variety of Linux operating systems.
提供了一個APT-style軟體庫以便在各種linux作業系統上安裝MySQL伺服器、用戶端和其他元件。
MySQL SUSE Repository
MySQL存儲庫使用在包管理工具提供了一種簡單而友善的方法,可以通過最新的軟體包來安裝和更新MySQL産品。
二、MySQL Community Server各版本
1.各版本主要差別
MySQL 4.0版本
增加了子查詢的支援,字元集增加UTF-8,GROUP BY語句增加了ROLLUP,mysql.user表采用了更好的加密算法,InnoDB開始支援單獨的表空間
MySQL 5.0版本
增加了Stored procedures、Views、Cursors、Triggers、XA transactions的支援,增加了INFORATION_SCHEMA系統資料庫
MySQL 5.1版本
增加了Event scheduler,Partitioning,Pluggable storage engine API ,Row-based replication、Global級别動态修改general query log和slow query log的支援。
MySQL 5.5版本
1)預設存儲引擎更改為InnoDB
2)提高性能和可擴充性
- 提高了預設線程并發數(innodb_thread_concurrency)
- 背景輸入/輸出線程控制(innodb_read_io_threads、innodb_write_io_threads)
- 主線程輸入/輸出速率控制(innodb_io_capacity)
- 作業系統記憶體配置設定程式使用控制(innodb_use_sys_malloc)
- 适應性散列索引(Hash Index)控制,使用者可以關閉适應性散列功能。
- 插入緩沖(Insert Buffering)控制,使用者可以關閉innodb的插入緩沖功能。
- 通過快速加鎖算法提高可擴充性,innodb不在使用代理(posix)線程,而是使用原生的獨立操作來完成互斥和讀寫鎖定。
- 恢複組送出(Restored Group Commit)
- 提高恢複性能
- 多緩沖池執行個體
- 多個復原段(Multiple Rollback Segments),之前的innodb版本最大能處理1023個并發處理操作,現在mysql5.5可以處理高達128K的并發事物,
- Linux系統固有的異步輸入/輸出,mysql5.5資料庫系統也提高了linux系統的輸入輸出請求的并發數。
- 擴充變化緩沖:添加了删除緩沖和清除緩沖
- 改善了日志系統互斥和單獨重新整理(Flush)清單互斥
- 改善清除程式進度,在mysql5.5中清楚操作線程是獨立的線程,并支援并發,可以使用innodb_purge_treads配置。
- 改善事務進行中的中繼資料鎖定。例如,事物中一個語句需要鎖一個表,會在事物結束時釋放這個表,而不是像以前在語句結束時釋放表。
3)提高實用性
- 半同步複制(Semi-synchronous Replication)
- 複制Heartbeat
- 中繼日志自動恢複(Automatic Relay Log Recovery)
- 根據伺服器過濾項複制(Replication Per Server Filtering)
- 從伺服器複制支援的資料類型轉換(Replication Slave Side Data Type Conversions)
4)提高易管理性和效率
- 建立快速索引(Faster Index Creation)
- 高效的資料壓縮(Efficient Data Compression)
- 為大物件和可變長度列提供高效存儲
- 增加了INFORMATION_SCHEMA表,新的表提供了與InnoDB壓縮和事務處理鎖定有關的具體資訊。
5)提高可用性
- 針對SIGNAL/RESIGNAL的新SQL文法
- 新的表/索引分區選項。MySQL5.5将表和索引RANG和LIST分區範圍擴充到了非整數列和日期,并增加了在多個列上分區的能力。
6)改善檢測和診斷
Mysql5.5引入了一種新的性能架構(performancn_shema,P_S),用于監控mysql監控伺服器運作時的性能。
MySQL 5.6版本
提高InnoDB性能,支援延遲複制
1)InnoDB現在可以限制大量表打開的時候記憶體占用過多的問題(比如這裡提到的)(第三方已有更新檔)
2)InnoDB性能加強。如分拆kernel mutex;flush操作從主線程分離;多個perge線程;大記憶體優化等
3)InnoDB死鎖資訊可以記錄到 error 日志,友善分析
4)MySQL5.6支援延時複制,可以讓slave跟master之間控制一個時間間隔,友善特殊情況下的資料恢複。
5)表分區功能增強
6)MySQL行級複制功能加強,可以降低磁盤、記憶體、網絡等資源開銷(隻記錄能确定行記錄的字段即可)
7)Binlog實作 crash-safe
8)複制事件采用crc32校驗,增強master/slave 複制資料一緻性
9)新增 log_bin_basename (以前variables裡面沒有binlog位置資訊,對資料庫的監管很不友善)
2.MySQL 5.7版本新特性
(1)安全性
安全性是資料庫永恒的話題,在MySQL 5.7中,有不少安全性相關的改進。包括:
- MySQL資料庫初始化完成以後,會産生一個 root@localhost 使用者,從MySQL 5.7開始,root使用者的密碼不再是空,而是随機産生一個密碼,這也導緻了使用者安裝5.7時發現的與5.6版本比較大的一個不同點
- MySQL官方已經删除了test資料庫,預設安裝完後是沒有test資料庫的,就算使用者建立了test庫,也可以對test庫進行權限控制了
- MySQL 5.7版本提供了更為簡單SSL安全通路配置,并且預設連接配接就采用SSL的加密方式
- 可以為使用者設定密碼過期政策,一定時間以後,強制使用者修改密碼
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
- 可以”鎖”住使用者,用以暫時禁用某個使用者
ALTER USER 'jeffrey'@'localhost' ACCOUNT LOCK;
ALTER USER l 'jeffrey'@'localhost' ACCOUNT UNLOCK;
(2)靈活性
MySQL 5.7的兩個全新的功能,即JSON和generate column。
1)JSON
随着非結構化資料存儲需求的持續增長,各種非結構化資料存儲的資料庫應運而生(如MongoDB)。從最新的資料庫使用 排行榜 來看,MongoDB已經超過了PostgreSQL,其火熱程度可見一斑。
各大關系型資料庫也不甘示弱,紛紛提供對JSON的支援,以應對非結構化資料庫的挑戰。MySQL資料庫從5.7.8版本開始,也提供了對JSON的支援。其使用方式如下:
CREATE TABLE t1 (jdoc JSON);
INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
MySQL對支援JSON的做法是,在server層提供了一堆便于操作JSON的函數,至于存儲,就是簡單地将JSON編碼成BLOB,然後交由存儲引擎層進行處理,也就是說,MySQL 5.7的JSON支援與存儲引擎沒有關系,MyISAM 存儲引擎也支援JSON 格式。
MySQL支援JSON以後,總是避免不了拿來與MongoDB進行一些比較。但是,MySQL對JSON的支援,至少有兩點能夠完勝MongoDB:
- 可以混合存儲結構化資料和非結構化資料,同時擁有關系型資料庫和非關系型資料庫的優點
- 能夠提供完整的事務支援
2)generate column
generated column是MySQL 5.7引入的新特性,所謂generated column,就是資料庫中這一列由其他列計算而得。
例如,知道直角三角形的兩條直角邊,要求直角三角形的面積。很明顯,面積可以通過兩條直角邊計算而得,那麼,這時候就可以在資料庫中隻存放直角邊,面積使用generated column,如下所示:
CREATE TABLE triangle (sidea DOUBLE, sideb DOUBLE, area DOUBLE AS (sidea * sideb / 2));
insert into triangle(sidea, sideb) values(3, 4);
select * from triangle;
+-------+-------+------+
| sidea | sideb | area |
+-------+-------+------+
| 3 | 4 | 6 |
+-------+-------+------+
在MySQL 5.7中,支援兩種generated column,即virtual generated column和stored generated column,前者隻将generated column儲存在資料字典中(表的中繼資料),并不會将這一列資料持久化到磁盤上;後者會将generated column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,後者存放了可以通過已有資料計算而得的資料,需要更多的磁盤空間,與virtual column相比并沒有優勢。是以,在不指定generated column的類型時,預設是virtual column,如下所示:
show create table triangle\G
*************************** 1. row ***************************
Table: triangle
Create Table: CREATE TABLE `triangle` (
`sidea` double DEFAULT NULL,
`sideb` double DEFAULT NULL,
`area` double GENERATED ALWAYS AS (((`sidea` * `sideb`) / 2)) VIRTUAL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
如果讀者覺得generate column提供的功能,也可以在使用者代碼裡面實作,并沒有什麼了不起的地方,那麼,或許還有一個功能能夠吸引挑剔的你,那就是為generate column建立索引。在這個例子中,如果我們需要根據面積建立索引以加快查詢,就無法在使用者代碼裡面實作,使用generate column就變得非常簡單:
alter table triangle add index ix_area(area);
(3)易用性
在MySQL 5.7中,有很多易用性方面的改進,小到一個用戶端快捷鍵 ctrl+c 的使用,大到專門提供一個系統庫(sys)來幫助DBA和開發人員使用資料庫。
- 在linux下,我們經常使用 ctrl+c 來終止一個指令的運作,在MySQL 5.7 之前,如果使用者輸入了錯誤的SQL語句,按下 ctrl+c ,雖然能夠”結束”SQL語句的運作,但是,也會退出目前會話,MySQL 5.7對這一違反直覺的地方進行了改進,不再退出會話。
- MySQL 5.7可以explain一個正在運作的SQL,這對于DBA分析運作時間較長的語句将會非常有用
- 在MySQL 5.7中,performance_schema提供了更多監控資訊,包括記憶體使用,MDL鎖,存儲過程等
sys schema
sys schema是MySQL 5.7.7中引入的一個系統庫,包含了一系列視圖、函數和存儲過程, 該項目專注于MySQL的易用性。
例如,我們可以通過sys schema快速的知道,哪些語句使用了臨時表,哪個使用者請求了最多的io,哪個線程占用了最多的記憶體,哪些索引是無用索引等;
sys schema中包含了大量的視圖,那麼,這些視圖的資訊來自哪裡呢?
視圖中的資訊均來自performance schema統計資訊。
這裡 有一個很好的比喻:
For Linux users I like to compare performance_schema to /proc, and SYS to vmstat.
也就是說,performance schema提供了資訊源,但是,沒有很好的将這些資訊組織成有用的資訊,進而沒有很好的發揮它們的作用。而sys schema使用performance schema資訊,通過視圖的方式給出解決實際問題的答案。
例如,下面這些問題,在MySQL 5.7之前,需要借助外部工具才能知道,在MySQL 5.7中,直接查詢sys庫下相應的表就能得到答案:
- 如何檢視資料庫中的備援索引
select * from sys.schema_redundant_indexes;
- 如何擷取未使用的索引
select * from schema_unused_indexes;
- 如何檢視使用全表掃描的SQL語句
select * from statements_with_full_table_scans
(4)可用性
MySQL 5.7在可用性方面的改進也帶給人不少驚喜。這裡介紹特别有用的幾項改進,包括:
- 線上設定複制的過濾規則,不再需要重新開機MySQL,隻需要停止SQL thread,修改完成以後,啟動SQL thread
-
線上修改buffer pool的大小
MySQL 5.7為了支援online buffer pool resize,引入chunk的概念,每個chunk預設是128M,當我們線上修改buffer pool的時候,以chunk為機關進行增長或收縮。這個參數的引入,對innodb_buffer_pool_size的配置有了一定的影響。innodb要求buffer pool size是innodb_buffer_pool_chunk_size* innodb_buffer_pool_instances的倍數,如果不是,将會适當調大innodb_buffer_pool_size,以滿足要求,是以,可能會出現buffer pool的實際配置設定比配置檔案中指定的size要大的情況
- Online DDL MySQL 5.7支援重命名索引和修改varchar的大小,這兩項操作在之前的版本中,都需要重建索引或表
ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
- 線上開啟GTID ,在之前的版本中,由于不支援線上開啟GTID,使用者如果希望将低版本的資料庫更新到支援GTID的資料庫版本,需要先關閉資料庫,再以GTID模式啟動,是以導緻更新起來特别麻煩。MySQL 5.7以後,這個問題不複存在。
(5)性能
性能一直都是使用者最關心的問題,在MySQL每次新版本中,都會有不少性能提升。在MySQL 5.7中,性能相關的改進非常多,這裡僅介紹部分改進,包括臨時表相關的性能改進、隻讀事務的性能優化、連接配接建立速度的優化和複制性能的改進。
1)臨時表的性能改進
MySQL 5.7 為了提高臨時表相關的性能,對臨時表相關的部分進行了大幅修改,包括引入新的臨時表空間;對于臨時表的DDL,不持久化相關表定義;對于臨時表的DML,不寫redo,關閉change buffer等。所有臨時表的改動,都基于以下兩個事實 :
- 臨時表隻在目前會話中可見
- 臨時表的生命周期是目前連接配接(MySQL當機或重新開機,則目前連接配接結束)
也就是說,對于臨時表的操作,不需要其他資料一樣嚴格地進行一緻性保證。通過不持久化元資訊,避免寫redo等方式,減少臨時表操作的IO,以提高臨時表操作的性能。
2)隻讀事務性能改進
衆所周知,在傳統的OLTP應用中,讀操作遠多于寫操作,并且,讀操作不會對資料庫進行修改,如果是非鎖定讀,讀操作也不需要進行加鎖。是以,對隻讀事務進行優化,是一個不錯的選擇。
在MySQL 5.6中,已經對隻讀事務進行了許多優化。例如,将MySQL内部實作中的事務連結清單分為隻讀事務連結清單和普通事務連結清單,這樣在建立ReadView的時候,需要周遊事務連結清單長度就會小很多。
在MySQL 5.7中,首先假設一個事務是一個隻讀事務,隻有在該事務發起了修改操作時,才會将其轉換為一個普通事務。MySQL 5.7通過避免為隻讀事務配置設定事務ID ,不為隻讀事務配置設定復原段,減少鎖競争等多種方式,優化了隻讀事務的開銷,提高了資料庫的整體性能。
3)加速連接配接處理
在MySQL 5.7之前,變量的初始化操作(THD、VIO)都是在連接配接接收線程裡面完成的,現在将這些工作下發給工作線程,以減少連接配接接收線程的工作量,提高連接配接的處理速度。這個優化對那些頻繁建立短連接配接的應用,将會非常有用。
4)複制性能的改進
MySQL的複制延遲是一直被诟病的問題之一,欣喜的是,MySQL 5.7版本已經支援”真正”的并行複制功能。MySQL 5.7并行複制的思想簡單易懂,簡而言之,就是”一個組送出的事務都是可以并行回放的”,因為這些事務都已進入到事務的prepare階段,則說明事務之間沒有任何沖突(否則就不可能送出)。MySQL 5.7以後,複制延遲問題永不存在。
這裡需要注意的是,為了相容MySQL 5.6基于庫的并行複制,5.7引入了新的變量slave-parallel-type,該變量可以配置成DATABASE(預設)或LOGICAL_CLOCK。可以看到,MySQL的預設配置是庫級别的并行複制,為了充分發揮MySQL 5.7的并行複制的功能,我們需要将slave-parallel-type配置成LOGICAL_CLOCK。
3.選擇合适的下載下傳版本

我們選擇Generally Available(GA)Release 去下載下傳。GA 是指軟體的通用版本,一般指正式釋出的版本。