![2c5692a2e4568a8f58da4abbf48b86c2.png](https://i-blog.csdnimg.cn/blog_migrate/f683b04e96ec41daff83de0a5e5a66b0.jpeg)
通过测试,比较 MySQL 5.7.25 和 MySQL 8.0.15 之间字符集和校验规则的设置所带来的性能差异。
测试环境
- 系统 | Ubuntu 18.04 LTS (bionic)
- 内核 | 4.15.0-20-generic
- 处理器 | physical = 2, cores = 28, virtual = 56, hyperthreading = yes
- 型号 | 56xIntel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz<
- 内存 | 376.6G
我将用 sysbench 测试不同数量的线程下 oltp_read_only 和 oltp_point_select 两种工作负载。
sysbench oltp_read_only --mysql-ssl=off --report-interval=1 --time=300 --threads=$i --tables=10 --table-size=10000000 --mysql-user=root runsysbench oltp_point_select --mysql-ssl=off --report-interval=1 --time=300 --threads=$i --tables=10 --table-size=10000000 --mysql-user=root ru
OLTP_READ_ONLY (latin1 字符集)的结果:
![5c5b1aa63029c295c1f23a1f158213d8.png](https://i-blog.csdnimg.cn/blog_migrate/9f85b3ea0fbd931dff71146f05108c39.jpeg)
OLTP_POINT_SELECT(latin1 字符集)的结果:
![2c9c21ef7947c24bca88dadd826d1052.png](https://i-blog.csdnimg.cn/blog_migrate/19099166181ba4f20dfe121cf38ba755.jpeg)
我们可以看到,在 OLTP_READ_ONLY 的工作负载中,MySQL 8.0.15 慢了 10%,而对于 OLTP_POINT_SELECT 的工作负载,MySQL 8.0.15 慢了 12-16%。
虽然差异不一定很大,但这足以说明 MySQL 8.0.15 在这组测试的各种工作负载中,性能不如 MySQL 5.7.25。
但是,如果我们使用 utf8mb4 字符集而不是 latin1,结果的似乎会改变。
因为 utf8mb4 现在是 MySQL 8.0 中的默认字符集,让我们比较 MySQL 5.7.25 的 latin1 和 utf8mb4。
但在我们这样做之前,让我们来看看 COLLATION(校对字符集)。
MySQL 5.7.25 使用默认排序规则 utf8mb4_general_ci,但是,我读到要对东欧语言使用正确的排序和比较,您可能需要使用 utf8mb4_unicode_ci 排序规则。
所以让我们比较每个版本 latin1 和 utf8mb4(默认排序规则)。首先是 5.7:
![669540eaaa27c13bbc537107a6013f98.png](https://i-blog.csdnimg.cn/blog_migrate/648b73e507e5c0499b04d2613f7a4422.jpeg)
![4043e45d996c16bd5047be744149de96.png](https://i-blog.csdnimg.cn/blog_migrate/f0f109195f8c2d704d59067cf6707cde.jpeg)
所以在这里我们可以看到 MySQL 5.7 中的 utf8mb4 实际上比 latin1 慢得多(55-60%)
对于 MySQL 8.0.15 也一样
![5fb1a59ad73a838f0ef373b947da9459.png](https://i-blog.csdnimg.cn/blog_migrate/a8b16370a619e9b7c1c39a65a996c6af.jpeg)
![7bc5dd2089497302d803c6bc8794aec4.png](https://i-blog.csdnimg.cn/blog_migrate/ad07c206297db848f7502199037196ee.jpeg)
对于 MySQL 8.0,utf8mb4 的命中率要低得多(高达11%)
现在让我们比较 utf8mb4 的所有排序规则
对于 MySQL 5.7
![8a2df72635f4091a8bcee74201ea0b5b.png](https://i-blog.csdnimg.cn/blog_migrate/6266fd31a5282ccc379505834e5b9026.jpeg)
![862f6dfbc30ab38cb1bba9be7b0e9fe8.png](https://i-blog.csdnimg.cn/blog_migrate/417650b21a217317088d1db9500e2468.jpeg)
如果你打算使用 utf8mb4_unicode_ci,你将获得更高的性能(与 utf8mb4_general_ci 相比)
对于 MySQL 8.0.15
![591deba9ca707abc8b51d88fce48f626.png](https://i-blog.csdnimg.cn/blog_migrate/fcef19d415cc1e92748d7c25f300fe0d.jpeg)
![f9ec97e12948280c97162bc69e068485.png](https://i-blog.csdnimg.cn/blog_migrate/0e918beb85269d8b4fa48974c8a76dde.jpeg)
现在让我们在 utf8mb4 中使用默认排序规则比较 MySQL 8.0 和 MySQL 5.7:
![de7616bcb767079ca9b15b335d6c1147.png](https://i-blog.csdnimg.cn/blog_migrate/0e809d22fc3c5c88134618d684585c76.jpeg)
![515e5f24cec1699c35ac29edc58ac58f.png](https://i-blog.csdnimg.cn/blog_migrate/18050620db92a7854cb73fba2f3e0996.jpeg)
在这种情况下,MySQL 8.0 实际上比 MySQL 5.7 好34%
结论
- MySQL 5.7 在 latin1 字符集中胜过 MySQL 8.0
- 如果我们使用 utf8mb4 字符集,MySQL 8.0 会大幅超越 MySQL 5.7
- 请注意,MySQL 8.0 现在默认为 utf8mb4 ,而 MySQL 5.7 默认为 latin1
- 当运行 MySQL 8.0 与 MySQL 5.7 之间的比较时,请注意您正在使用的字符集,因为它可能会影响比较很多。
![ad97e4936ffce5a03fa8476f59bfb105.png](https://i-blog.csdnimg.cn/blog_migrate/e645934d6b4ca3fc3f2b5386bebe1d99.jpeg)