目錄一、MySQL升級到8.0.X版本1、升級的原因及MySQL8.0版本新特性2、下載MySQL3、備份數據4、卸載原版本MySQL5、安裝下載的新版本。6、MySQL升級後的兼容性問題
二、升級MySQL驅動mysql-connector-java升級到8.0.X版本1、為什麼要升級驅動版本2、升級版本3、修改配置4、mysql-connector-java升級到8.0之後的一些兼容問題三、MySQL8.0和5.7性能對比1、InnoDB Row Operations2、Transactions Processed3、CPU Resources一、MySQL升級到8.0.X版本1、升級的原因及MySQL8.0版本新特性
比MySQL 5.7快2倍,僅這一個理由就夠了,而且還有其他許多很好的新特性:
1.
性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來了更好的性能:讀/寫工作負載、IO 密集型工作負載、以及高競爭("hot spot"熱點競爭問題)工作負載。
2.
NoSQL:MySQL 從 5.7 版本開始提供 NoSQL 存儲功能,目前在 8.0 版本中這部分功能也得到了更大的改進。該項功能消除了對獨立的 NoSQL 文檔數據庫的需求,而 MySQL 文檔存儲也為 schema-less 模式的 JSON 文檔提供了多文檔事務支持和完整的 ACID 合規性。
3.
窗口函數(Window Functions):從 MySQL 8.0 開始,新增了一個叫窗口函數的概念,它可以用來實現若乾新的查詢方式。窗口函數與 SUM()、COUNT() 這種集合函數類似,但它不會將多行查詢結果合並為一行,而是將結果放回多行當中。即窗口函數不需要 GROUP BY。
4.
隱藏索引:在 MySQL 8.0 中,索引可以被“隱藏”和“顯示”。當對索引進行隱藏時,它不會被查詢優化器所使用。我們可以使用這個特性用於性能調試,例如我們先隱藏一個索引,然後觀察其對數據庫的影響。如果數據庫性能有所下降,說明這個索引是有用的,然後將其“恢複顯示”即可;如果數據庫性能看不出變化,說明這個索引是多餘的,可以考慮刪掉。
5.
降序索引:MySQL 8.0 為索引提供按降序方式進行排序的支持,在這種索引中的值也會按降序的方式進行排序。
6.
通用表表達式(Common Table Expressions CTE):在複雜的查詢中使用嵌入式表時,使用 CTE 使得查詢語句更清晰。
7.
UTF-8 編碼:從 MySQL 8 開始,使用 utf8mb4 作為 MySQL 的默認字符集。
8.
JSON:MySQL 8 大幅改進了對 JSON 的支持,添加了基於路徑查詢參數從 JSON 字段中抽取數據的 JSON_EXTRACT() 函數,以及用於將數據分別組合到 JSON 數組和對象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數。
9.
可靠性:InnoDB 現在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以實現事務完整性了,要麼失敗回滾,要麼成功提交,不至於出現 DDL 時部分成功的問題,此外還支持 crash-safe 特性,元數據存儲在單個事務數據字典中。
10.
高可用性(High Availability):InnoDB 集群為您的數據庫提供集成的原生 HA 解決方案。
11.
安全性:對 OpenSSL 的改進、新的默認身份驗證、SQL 角色、密碼強度、授權。
詳細更新說明:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-11.html
官方發布說明:https://blogs.oracle.com/mysql/announcing-general-availability-of-mysql-80
MySQL 8 正式版的新增功能:https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/
參考資料:https://www.cnbeta.com/articles/soft/718465.htm
2、下載MySQL
官網:https://dev.mysql.com/downloads/mysql/
到官網,下載MySQL Community Server,這個是日常使用版本,選擇要安裝的操作系統,下載對應的安裝包,下載最新的穩定版本即可。
3、備份數據
保留數據SQL腳本,沒有的話導出,可以使用Navicat等工具進行備份。
4、卸載原版本MySQL
直接按照普通軟件卸載的方式卸載即可。
5、安裝下載的新版本。
8.0和以前比較安裝步驟簡單了許多,一步一步安裝即可。
6、MySQL升級後的兼容性問題
兼容性還是可以的,目前為止筆者還沒遇到有兼容問題。
雖然網上說會有一點兼容問題,但是還是應該升級,不能因噎廢食,利益明顯大於弊端。當然也要考慮實際情況,最好不要在版本忙碌期間進行,可以選擇一個不是很忙的版本,最為一個事項來做升級,然後進行充分驗證和修改,保證升級後的功能正常。
二、升級MySQL驅動mysql-connector-java升級到8.0.X版本
1、為什麼要升級驅動版本
筆者原來安裝MySQL後,驅動沒升級,使用的mysql-connector-java 5.1.47,驗證功能也沒問題,能夠連接數據庫。
但是一定要升級,升級後使用新的驅動類,無論是啟動加載速度還是數據庫查詢速度性能都有明顯提升。
筆者本地弄了個實例,對比了下,雖然數據量小,差距不明顯,但是還是明顯看到性能提升:
2、升級版本
直接下載最新版本jar包或,修改引用的版本號。可以到maven的一些搜索網站(如https://mvnrepository.com/)進行搜索可用版本。
<! https://mvnrepository.com/artifact/mysql/mysql-connector-java >
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
3、修改配置
1、驅動類變了,原來是由原來的com.mysql.jdbc.Driver改為com.mysql.cj.jdbc.Driver
不修改會影響性能,啟動過程中有告警:
Loading class `
com.mysql.jdbc.Driver'. This is
deprecated. The new driver class is `
com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
修改後的驅動程序通過SPI自動注冊,通常不需要手動加載驅動程序類。
2、jdbc_url上的時區變為必須配置,否則會啟動報錯
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
如:
jdbc:mysql://localhost:3306/dbname?characterEncoding=utf-8&useSSL=true&serverTimezone=GMT
4、mysql-connector-java升級到8.0之後的一些兼容問題
基本還是兼容的,但是有一些不兼容的地方,目前已經筆者知道的有2點:
1、如果數據庫表自增主鍵id是bigint類型,原來版本執行後返回的id是Long類型,現在改為了BigInteger類型,如果是使用mybatis基本沒問題;如果是自定義的JDBC框架就要格外注意看處理是否有問題,類型是否存在不匹配導致問題。
2、日期類型的字段處理可能存在問題,如表中字段為TIMESTAMP,之前查詢返回能夠返回毫秒值,升級後不再返回。如果在查詢時有使用日期轉換函數轉換為String,並且對毫秒值進行了處理,那麼升級後會報錯,需要去掉對毫秒值得處理。如果查詢返回直接映射為Date就沒問題。
三、MySQL8.0和5.7性能對比
有一份做的很好的性能對比資料,筆者這裏就不做重複工作了,參考這個資料可以看出性能提升是實實在在的。
資料地址:https://severalnines.com/blog/mysql-performance-benchmarking-mysql-57-vs-mysql-80
轉載自上面資料的性能對比圖:
1、InnoDB Row Operations
2、Transactions Processed
3、CPU Resources