このテーブルに 1 つの列 (numviews) を持つ 1 つの mysql テーブルがあり、頻繁に更新されます (同じ更新クエリがループで実行されます)。2 秒以上の時間がかかっており、このテーブルに依存しているアプリケーションにも影響を与えたり遅くしたりしているため、これを改善する方法を見つけることができません。これがmysqlテーブルです。
注: これは innodb テーブルであり、他に遅いクエリはありません。このテーブルは、mariadb galera クラスターの下にあります。私も300の最大接続を持っています。どの時点でも、グローバル接続は 170/180 を超えません。
CREATE TABLE `data_table` (
`site` VARCHAR(100) NOT NULL DEFAULT '',
`active` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`numclicks` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`numviews` INT(20) UNSIGNED NOT NULL DEFAULT '0',
`country` VARCHAR(200) DEFAULT NULL,
`viewcount` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`name` VARCHAR(150) NOT NULL DEFAULT '',
`comments` TEXT NOT NULL,
`boost` FLOAT DEFAULT '0',
`daily_limit` INT(11) DEFAULT '0',
PRIMARY KEY (`site`)
) ENGINE=INNODB DEFAULT CHARSET=latin1
そして、これがループで実行されるmysql更新クエリです(このテーブルで以下のクエリが約50回実行されます)。
UPDATE data_table set numviews = numviews + 1 where site='xyz';
Query OK, 1 row affected (2.57 sec)
Rows matched: 1 Changed: 1 Warnings: 0
SELECT site,active,numclicks,numviews,country,viewcount FROM data_table WHERE site='xyz'\G
*************************** 1. ROW ***************************
site: xyz
active: 1
numclicks: 130406
numviews: 48962
country: |xx yy |
viewcount: 134022
編集:デッドロックも見られます。
------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 3020 page no 10 n bits 120 index `PRIMARY` of table `data_table`trx table locks 1 total table locks 47 trx id 71211631903 lock_mode X locks rec but not gap waiting lock hold time 2 wait time before grant 0
------------------
---TRANSACTION 71211631885, ACTIVE 2 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
MySQL thread id 1083597, OS thread handle 0x7f782a335700, query id 184464304 machine1 XX.XX.XX.XX user updating
UPDATE data_table set numviews = numviews + 1 where site='xyz'
Trx #rec lock waits 12 #table lock waits 0
Trx total rec lock wait time 12 SEC
Trx total table lock wait time 0 SEC
------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 3020 page no 10 n bits 120 index `PRIMARY` of table `data_table` trx table locks 1 total table locks 47 trx id 71211631885 lock_mode X locks rec but not gap waiting lock hold time 2 wait time before grant 0
------------------
---TRANSACTION 71211631883, ACTIVE 2 sec
mysql tables in use 1, locked 1
2 lock struct(s), heap size 360, 1 row lock(s), undo log entries 1
MySQL thread id 1082885, OS thread handle 0x7f713e848700, query id 184464302 xxx XX.XX.XX.XX user query end
UPDATE data_table set numviews = numviews + 1 where site='xyz'
Trx #rec lock waits 225 #table lock waits 0
Trx total rec lock wait time 366 SEC
Trx total table lock wait time 0 SEC
この更新クエリを改善する方法を教えてもらえますか?