一、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 是指軟件的通用版本,一般指正式發布的版本。