0

InnoDB テーブルに非常に単純な MySQL 更新クエリがあります。

UPDATE `players_teams` SET t_last_active=NOW() WHERE t_player_id=11225 AND t_team_id=6912 AND t_season_id=2002 LIMIT 1

私のテーブルは次のように構成されています。

CREATE TABLE `players_teams` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `t_player_id` int(11) DEFAULT NULL,
  `t_team_id` int(11) DEFAULT NULL,
  `t_league_id` int(11) DEFAULT NULL,
  `t_season_id` int(11) DEFAULT NULL,
  `t_div` varchar(64) DEFAULT NULL,
  `t_player_number` varchar(3) DEFAULT NULL,
  `t_player_jersey_size` enum('UNKNOWN','XS','S','M','L','XL','XXL','XXXL') DEFAULT 'UNKNOWN',
  `t_player_registration_number` varchar(64) DEFAULT NULL,
  `t_player_class` enum('ROSTER','SPARE','COACH','INJURED','HOLIDAY','SUSPENDED','SCOREKEEPER') DEFAULT 'ROSTER',
  `t_access_level` enum('PLAYER','MANAGER','ASSISTANT') DEFAULT 'PLAYER',
  `t_player_position` enum('ANY','FORWARD','DEFENCE','GOALIE','PITCHER','CATCHER','FIRST BASE','SECOND BASE','THIRD BASE','SHORTSTOP','LEFT FIELD','CENTER FIELD','RIGHT FIELD') DEFAULT 'ANY',
  `t_spare_status` enum('INVITED','IN','OUT') DEFAULT NULL,
  `t_drink_next` int(1) DEFAULT '0',
  `t_no_fees` tinyint(1) DEFAULT '0',
  `t_no_drink` tinyint(1) DEFAULT '0',
  `t_auto_check_in` tinyint(1) DEFAULT '0',
  `t_print_reminder` tinyint(1) DEFAULT '0',
  `t_notes` text,
  `t_last_chatter_id` int(11) DEFAULT NULL,
  `t_last_history_id` int(11) DEFAULT NULL,
  `t_last_active` timestamp NULL DEFAULT NULL,
  `t_status` enum('ACTIVE','INACTIVE','ARCHIVED') DEFAULT 'ACTIVE',
  `t_added` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `t_player_id` (`t_player_id`),
  KEY `t_team_id` (`t_team_id`),
  KEY `t_season_id` (`t_season_id`),
  KEY `t_player_id_2` (`t_player_id`,`t_team_id`,`t_season_id`),
  KEY `Team/Player ID` (`t_team_id`,`t_player_id`),
  KEY `UpdatePlayersDiv` (`t_team_id`,`t_season_id`)
) ENGINE=InnoDB AUTO_INCREMENT=23454 DEFAULT CHARSET=latin1;

この単純な更新クエリは、平均で 3.5 秒かかりますか? これを MediaTemple MySQL GRID コンテナーで実行しています。

これは、UPDATE を SELECT に切り替えたときの EXPLAIN の結果です。

EXPLAINの結果

私がこれを正しく行っていない方法について誰かが洞察を提供できますか?

[編集: インデックスのリストを追加]

それで、これはインデックスの大きな混乱ですか?ここに冗長なインデックスがたくさんありますか?

ここに画像の説明を入力

乾杯、ジョン

4

1 に答える 1

1

3 つの列のインデックスではなく、間違ったキーを使用しています。構文を使用してインデックスをヒントできUSE KEY ...ます。

https://dev.mysql.com/doc/refman/5.1/en/index-hints.html

3 つの列でキーの順序を変更することもできます。一般に、最も制限の厳しい列をインデックスの最初に配置し、次に制限の厳しい列を順番に配置します。

于 2015-06-13T16:50:20.850 に答える