假设我们有一个包含多个列的表,我们在两个列上建立索引:玩家 1 和玩家 2:
GAME PLAYER 1 PLAYER 2 ...
==== ======== ========
1 John Dan
2 Carl William
3 Carl John
...
仅在单列上索引的备用表结构:玩家 1(并且行数加倍):
GAME PLAYER 1 PLAYER 2 ...
==== ======== ========
1 John Dan
1 Dan John
2 Carl William
2 William Carl
3 Carl John
3 John Carl
...
我想查询John参加过的所有比赛,哪种表结构/方式更好?
需要考虑的事项:
- 这是一个简化版本,必须考虑到表将包含至少数百行,并且查询中将有多个连接。
- 玩家列上会有连接,因此使用带有“OR”/“UNION”的 TWO COLUMN 方法也会使一些连接加倍。
- 单列方法需要在游戏 列上使用“GROUP BY”。
- 我们不想耗尽内存,查询应该在内存中保持运行!
- TWO COLUMN 方法已经变慢了,现在依靠 Mysql 的内置缓存来保持它以舒适的速度运行。我正在考虑采用单列方法,但不确定后果。
- 另一种解决方案是使用一个包含Player 和Game(外键) 的附加表。
最佳答案
在这个简单的例子中,在两列上都有一个索引,无论如何,您基本上都会使用索引将表的大小加倍。
如果有超过 2 个玩家列,则第二种方法的行数等于游戏数的幂玩家列数,而索引方法将只需将游戏数量乘以索引空间的玩家列数即可。
无论哪种方式,为了提高性能,最好用引用另一个表中球员姓名的 ID 替换姓名。
此外,在我看来可能有更简单的方法。
GAME PLAYER
==== ========
1 John
1 Dan
2 Carl
2 William
3 Carl
3 John
无需复制数据。在这里你仍然可以检索所有参加比赛 1 的球员,现在你可以更容易地检索每个球员参加的比赛。在这里,你只需要一个索引。然而,这可能会使其他一些查询复杂化。
关于mysql - 两列 "OR"查询速度与单列 "DOUBLE THE ROWS"查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230598/