您可以在 MySQL 中索引外键列吗?
Can you index a foreign key column in MySQL?
假装我有这个模式:
Table: University
String: name
Integer: studentCount
Table: Event
String: name
Foreign Key: university -> University
Table: Attendance
String: name
Foreign Key: event -> Event
如果我想获取与学生人数超过 1000 的大学关联的所有出勤行,优化数据库索引的最佳方法是什么?
能不能有个索引追外键?
就像考勤中的索引 table 合并了:(event__university__studentCount)
一个索引只能引用一个 table 中的列。没有跨越多个 table 的索引。
至少在 MySQL 中也不支持计数或其他聚合的索引。 SQL 数据库还有其他针对聚合进行优化的实现,这些实现可能会索引聚合函数的结果。我正在考虑 OLAP 列存储。
使用 MySQL 你可以这样查询:
SELECT Event.*
FROM Event
JOIN Attendance ON Attendance.Event = Event.id
WHERE Event.University = ?
GROUP BY Event.id
HAVING COUNT(*) > 1000;
Attendance.Event
上的外键隐式创建了一个索引,因此将以这种方式优化连接。但是 COUNT(*)
确实需要检查每一行。在像 MySQL.
这样的 OLTP 数据库中没有办法解决这个问题
对此进行优化的一种解决方案是将当前参加者人数存储在活动 table 中。然后它可以被索引并且可以在没有连接或聚合的情况下找到匹配的事件。
SELECT * FROM Event
WHERE University = ? AND AttendeeCount > 1000;
这是一个反规范化的例子。
假装我有这个模式:
Table: University
String: name
Integer: studentCount
Table: Event
String: name
Foreign Key: university -> University
Table: Attendance
String: name
Foreign Key: event -> Event
如果我想获取与学生人数超过 1000 的大学关联的所有出勤行,优化数据库索引的最佳方法是什么?
能不能有个索引追外键?
就像考勤中的索引 table 合并了:(event__university__studentCount)
一个索引只能引用一个 table 中的列。没有跨越多个 table 的索引。
至少在 MySQL 中也不支持计数或其他聚合的索引。 SQL 数据库还有其他针对聚合进行优化的实现,这些实现可能会索引聚合函数的结果。我正在考虑 OLAP 列存储。
使用 MySQL 你可以这样查询:
SELECT Event.*
FROM Event
JOIN Attendance ON Attendance.Event = Event.id
WHERE Event.University = ?
GROUP BY Event.id
HAVING COUNT(*) > 1000;
Attendance.Event
上的外键隐式创建了一个索引,因此将以这种方式优化连接。但是 COUNT(*)
确实需要检查每一行。在像 MySQL.
对此进行优化的一种解决方案是将当前参加者人数存储在活动 table 中。然后它可以被索引并且可以在没有连接或聚合的情况下找到匹配的事件。
SELECT * FROM Event
WHERE University = ? AND AttendeeCount > 1000;
这是一个反规范化的例子。