mysql - 两列 "OR"查询速度与单列 "DOUBLE THE ROWS"查询速度

标签 mysql sql optimization

假设我们有一个包含多个列的表,我们在两个列上建立索引:玩家 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 的内置缓存来保持它以舒适的速度运行。我正在考虑采用单列方法,但不确定后果。
  • 另一种解决方案是使用一个包含PlayerGame(外键) 的附加表。

最佳答案

在这个简单的例子中,在两列上都有一个索引,无论如何,您基本上都会使用索引将表的大小加倍。

如果有超过 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/

相关文章:

mysql - 为什么mysql查询中的这个if语句总是返回null?

php - 如何使用 php mysql LOAD DATA INFILE 将每个记录的变量值增加 1

SQL Server 2008 - 高级搜索/排序

c++ - 是否允许编译器优化堆内存分配?

c++ - pqxx 返回刚刚插入的行的 id

MySQL 从上一行添加值

php - PHP/MySQL-mysql_result()期望参数1为资源, boolean 值在[duplicate]中给出

sql - 如何在 Azure SQL 数据库实例之间移动数据

javascript - Cube.js - 无法连接 2 个或更多表,但不断收到 "Can' t find join path to join“错误

optimization - 找到两个链表与重复项的交集