SELECT * FROM `game`
WHERE (hometeam=29 OR awayteam=29)
AND `sportid`=1
AND`date` BETWEEN '2012-07-01' AND '2013-06-30'
AND deleted=0
Run Code Online (Sandbox Code Playgroud)
这个简单的查询需要 0.5-1.1 秒(没有缓存)。表孔 1.6M 行,所以我认为它应该快得多(<0.1 秒)。在下面的解释中,它显示它正在搜索表的一半。您可以看到我尝试了各种索引变体,但都没有运气,它总是想使用 Sportid 索引。
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | game | ref | date,hometeam,awayteam,sportid,deleted,sportid_2,sportid_3,sportid_4,sportid_5,sportid_6 | sportid | 1 | const | 800368 | Using where
Run Code Online (Sandbox Code Playgroud)
SHOW CREATE TABLE 游戏
CREATE TABLE `game` (
`gameid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`sportid` tinyint(1) …
Run Code Online (Sandbox Code Playgroud) 我有一个大约 106k 行的表,其中大约 11k 行交换了 2 列中的值。我想运行一个查询来修复它,但我认为我不能这样做:
UPDATE `game`
SET `homescore`=`awayscore`, `awayscore`=`homescore`
WHERE (`awayscore`>`homescore` AND `winner`=`hometeam`) OR (`awayscore`<`homescore` AND `winner`=`awayteam`);
Run Code Online (Sandbox Code Playgroud)
或者我可以吗?我担心这两个分数最终会得到相同的值。
另外,请验证我的查询是否符合我的意图:
我需要在记录的获胜者(这是正确的)与记录的分数不匹配的行上交换主客场得分(他们被现已修复的编码错误意外交换)说谁是获胜者(得分更高的球队) )。
mysql ×2