-1

このテーブルに 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

この更新クエリを改善する方法を教えてもらえますか?

4

3 に答える 3

0

急速に変化するカウンター (クリック数、ビュー数) は、別の表にする必要があります。そうすれば、それらの列を必要としないクエリ (読み取りと書き込み) はそれらに干渉しません。

トランザクションからそれを削除してUPDATEください。独自のトランザクションとして実行してください。

ガレラノードはどのくらい離れていますか? それらがたとえば 100 ミリ秒でクロスカントリーである場合、そのような更新は 1 秒あたり 10 回しか実行できません。その場合は、私の高速取り込みブログをお読みください。次に、Galera で MyISAM を使用して、より高いスループットを可能にする方法について説明しますUPDATEs

于 2016-05-27T23:18:28.273 に答える