这个问题在这里已经有答案了:
外键是否提高了查询性能(9个答案)两年前关门了。我正试图用laravel关系建立一个数据库。据我所知,外键是确保数据完整性和正确性的好方法。为什么不?我想用它。我的问题是:a) 在mysql中使用外键真的会降低性能吗?如果是,为什么会变慢?b) 如果速度变慢了,我该怎么办?一点也不用是不是更好?
lp0sw83n1#
答。是和否。假设在存储所有堆栈溢出问题的大表中包含一个userid,其中用户id是发布问题的人的。受此影响的查询类型是查找特定用户标识的所有堆栈溢出问题。这种推理类似于“如果有10亿个问题随机排列,你怎么知道你已经找到了用户giorgi的所有问题?”。直觉告诉我们你必须检查所有的问题。这里最重要的是1。有大量的记录2。你必须检查每一个,知道你已经找到了所有匹配的问题。但是,它只会影响使用此新字段的搜索。那么回答你的第二个问题:b。如果我们按照userid对问题进行排序,那么我们就不必查看所有的记录就知道我们已经找到了所有的记录!在sql中,这称为“索引表”。您可以通过指定表(在本例中是问题)和要索引或排序的字段(userid)来实现。这是sql优化中的常见做法,特别是在大型表上的外键中。在我看来,任何超过10000条记录都可以作为这种索引方式的候选,但真正的基准是您的搜索是否执行缓慢。如果它们没有引起任何问题,那么就没有理由建立索引,因为与之相关的开销很小。希望这能回答你的问题!
1条答案
按热度按时间lp0sw83n1#
答。是和否。假设在存储所有堆栈溢出问题的大表中包含一个userid,其中用户id是发布问题的人的。受此影响的查询类型是查找特定用户标识的所有堆栈溢出问题。
这种推理类似于“如果有10亿个问题随机排列,你怎么知道你已经找到了用户giorgi的所有问题?”。直觉告诉我们你必须检查所有的问题。这里最重要的是1。有大量的记录2。你必须检查每一个,知道你已经找到了所有匹配的问题。
但是,它只会影响使用此新字段的搜索。
那么回答你的第二个问题:
b。如果我们按照userid对问题进行排序,那么我们就不必查看所有的记录就知道我们已经找到了所有的记录!在sql中,这称为“索引表”。您可以通过指定表(在本例中是问题)和要索引或排序的字段(userid)来实现。
这是sql优化中的常见做法,特别是在大型表上的外键中。在我看来,任何超过10000条记录都可以作为这种索引方式的候选,但真正的基准是您的搜索是否执行缓慢。如果它们没有引起任何问题,那么就没有理由建立索引,因为与之相关的开销很小。
希望这能回答你的问题!