dro*_*kie 2 performance mysql-8.0
更新:这个问题的范围不包括基本的性能调整,并认为这些已经完成。因此,如果您乐于分享一些明显的变量,例如innodb_io_capacity
,innodb_flush_log_at_trx_commit
甚至设置innodb_flush_method
为O_DIRECT
您最近发现的美妙旋钮,情况并非如此。
最近,我将一台生产服务器从 MySQL 5.7 移到了 8.0。紧接着我注意到 update 语句有时(并不总是)花费更多时间(大量)并且在这些期间倾向于堆叠。
Mysql 配置相同,硬件相似(相同的 CPU,相同数量的 RAM 及其类型,相同的磁盘型号(仅增加了大小)),因此唯一改变的两件事是 FreeBSD 版本(11.x -> 12.x) 和 MySQL 版本 (5.7.x -> 8.0)。我真的怀疑这与 FreeBSD 12 有什么关系,所以我认为这是 MySQL 8.0 的细节。
看看服务器性能,我可以说有足够的 CPU 可用(至少 30% 或更多),磁盘 i/o 饱和度最高为 50%。所以问题是 - 8.0 中有什么东西会在某些时候停止更新?
这是更新声明及其简介:
UPDATE mp_user SET ts_update = NOW(), latitude = '42.962993621826',
longitude = '47.550437927246', accuracy = '515.91363525391',
source = 'lbs', batteryLevel = '81', steps = '0', turnovers = '0',
setCoordsTime = NOW() WHERE id = '3185997';
'starting','0.000294'
'Executing hook on transaction ','0.000072'
'starting','0.000066'
'checking permissions','0.000068'
'Opening tables','0.000144'
'init','0.000097'
'System lock','0.000095'
'updating','7.698311'
'end','0.000270'
'query end','0.000115'
'waiting for handler commit','0.012015'
'closing tables','0.000301'
'freeing items','0.000185'
'cleaning up','0.000108'
Run Code Online (Sandbox Code Playgroud)
这是表结构:
Create Table: CREATE TABLE `mp_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ts` datetime NOT NULL,
`ts_update` datetime NOT NULL,
`lastWakeUpPush` datetime DEFAULT NULL,
`type` enum('parent','child','admin') NOT NULL,
`latitude` double(10,7) NOT NULL DEFAULT '0.0000000',
`longitude` double(10,7) NOT NULL DEFAULT '0.0000000',
`accuracy` float(10,2) NOT NULL DEFAULT '0.00',
`source` enum('gps','wifi','lbs') DEFAULT NULL,
`batteryLevel` int(4) DEFAULT NULL,
`steps` int(4) DEFAULT NULL,
`turnovers` int(4) DEFAULT NULL,
`setCoordsTime` datetime DEFAULT NULL,
`phoneLogin` varchar(45) DEFAULT NULL,
`password` varchar(40) DEFAULT NULL,
`salt` varchar(15) DEFAULT '',
`licenseTo` datetime NOT NULL,
`monthForRepostUsed` tinyint(1) NOT NULL DEFAULT '0',
`monthForQuizUsed` tinyint(1) NOT NULL DEFAULT '0',
`isTrial` tinyint(1) NOT NULL DEFAULT '1',
`deviceUid` varchar(10) DEFAULT NULL,
`warnings` set('backgroundDataOff','geoDeviceOff','geoAppOff','noSim','noMobileDataTransfer','pushesOff','batteryOptimization','mic','appStats','noGoogleServices','backgroundServicesOff','wifiOff','accessibilityOff') DEFAULT NULL,
`locale` enum('en','en-US','ru','ar','zh','cs','nl','et','fi','fr','de','el','he','hu','id','it','ja','kk','ko','lv','lt','pl','pt','ro','esp','sv','tr','uk','vi','bg','sr','pt-BR') NOT NULL DEFAULT 'ru',
`lastNcPush` datetime DEFAULT NULL,
`priceGroup` int(11) DEFAULT NULL COMMENT 'Foreign key to mp_geoZonePriceGroup',
`healthCheckTime` datetime DEFAULT NULL,
`lastLogin` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `phoneLogin` (`phoneLogin`),
KEY `ts_update` (`ts_update`),
KEY `setCoordsTime` (`setCoordsTime`,`type`,`lastWakeUpPush`),
KEY `deviceUid` (`deviceUid`),
KEY `batteryLevel` (`batteryLevel`),
KEY `mp_user_mp_geoZonePriceGroup_id_fk` (`priceGroup`),
KEY `lastLoginidx` (`lastLogin`)
) ENGINE=InnoDB AUTO_INCREMENT=9465064 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Run Code Online (Sandbox Code Playgroud)
这是一个 8.0 优化器问题。可以很容易地通过加倍range_optimizer_max_mem_size
(并且,如果这没有帮助,进一步加倍)或仅将其设置为零来修复,这样它就可以使用所有可用内存量。
对我有用。不幸的是,我不是想弄清楚的人,而是来自付费 percona 支持台的人。有人告诉我这很可能发生在大桌子上。
小智 5
在研究了为什么我经常在插入和更新方面表现不佳以及连接经常处于“等待处理程序提交”状态后,我发现了您的问题。
我随后发现在 MySQL 8.0 中默认启用二进制日志记录。这是 MySQL 5 的重大变化。我没有使用复制,所以不需要二进制日志记录。当我在我的系统上关闭二进制日志时(在 MySql 的配置文件中添加了 skip_log_bin=1),“等待处理程序提交”变得非常罕见,性能向其 MySQL 5 级别迈出了重要的一步。
归档时间: |
|
查看次数: |
6782 次 |
最近记录: |