###前提・実現したいこと
UPDATE
が非常に遅いので速くしたいです。
accounts
テーブルに約1千万件のデータが入っています。
そのうち約180万件に対してUPDATE
をする必要があるのですが、約3時間たっても終わりません。CPU使用率も高い状態が続いています。(htopコマンドで確認しました)
###該当のソースコード
最終ログイン日時が2017/10/01以前のアカウントのみflag
を1にします。
別のプログラムでflag
の値を元に処理する必要があるからです。
※flagの値は全て0になっています。
sql
1UPDATE accounts a 2SET a.flag = 1 3WHERE a.last_login_time < '2017/10/01';
###テーブル情報
- accounts テーブル
全データ数約1千万件
key | column | data_type | length |
---|---|---|---|
Primary | user_id | int | 11 |
Key | uuid | varchar | 36 |
name | varchar | 50 | |
creation_time | timestamp | ||
Key | last_login_time | timestamp | |
Key | flag | int | 11 |
sql
1CREATE TABLE `accounts` ( 2 `user_id` INT(11) NOT NULL AUTO_INCREMENT, 3 `uuid` VARCHAR(36) NOT NULL, 4 `name` VARCHAR(50) NOT NULL, 5 `creation_time` TIMESTAMP NOT NULL DEFAULT '', 6 `last_login_time` TIMESTAMP NOT NULL DEFAULT '', 7 `flag` INT(11) NULL DEFAULT NULL, 8 PRIMARY KEY (`user_id`), 9 INDEX `uuid` (`uuid`), 10 INDEX `flag` (`flag`), 11 INDEX `last_login_time` (`last_login_time`) 12) 13COLLATE='utf8_general_ci' 14ENGINE=InnoDB 15AUTO_INCREMENT=0; 16
###その他情報
UPDATE
対象の件数
sql
1SELECT count(*) 2FROM accounts a 3WHERE a.last_login_time < '2017/10/01'; 4/* 出力 1,810,588 */ 5/* Affected rows: 0 Found rows: 1 注意: 0 Duration for 1 クエリー: 13.719 sec. */
###MariaDBのコンフィグ情報
- /etc/my.cnf.d/server.cnf
ini
1[server] 2 3[mysqld] 4innodb_buffer_pool_size=24000000000 5max_allowed_packet=256MB 6character-set-server = utf8 7max_connections = 10000 8max_user_connections = 10000 9max_connect_errors = 9999999 10wait_timeout = 30 11event_scheduler=ON 12datadir=/data/mysql 13socket=/data/mysql/mysql.sock 14 15[galera] 16 17[embedded] 18 19[mariadb] 20 21[mariadb-10.1]
###試したこと
- 不要なインデックスを削除する
accounts.name
に付いていたインデックスを削除しました。
速度に変化はありませんでした。
Optimize
を実行する
以下を実行しましたが速度に変化はありませんでした。
sql
1OPTIMIZE TABLE db_name.accounts 2 3/* note: Table does not support optimize, doing recreate + analyze instead */ 4/* status: OK */
###補足情報(言語/FW/ツール等のバージョンなど)
- VPS(KVM)をレンタルしています
- CentOS 7.3 64bit
- MariaDB 10.2.7

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/11 07:54
退会済みユーザー
2017/11/11 07:59
2017/11/11 08:44 編集
退会済みユーザー
2017/11/11 09:45
退会済みユーザー
2017/11/11 09:55
2017/11/11 11:46 編集