0

我正在设计一个 MySQL 数据库...

  1. 我有许多使用 UserID 作为主键的表。所有这些表将为每个用户保留 1 行,因此将以相同的速度增长。看到他们将通过主键(UserID)访问,我认为不需要索引这个键,因为每个键都是唯一的。

  2. 我还将有许多表,它们将递增数字作为主键,而 UserID 将是第二列。对于这些表,第二列中将有多个 UserID 实例。(每个这个 UserID 都有很多朋友,每个都列在不同的行上)。我希望这些表会变得很长,但不会很宽,因此相对于 GB 来说不会很大。

问题:如果我在上面第 2 部分(UserID/第二列)中的表上添加索引,并且如果我的查询使用 UserID 进行联接(所有联接都关闭 UserID),这是否意味着联接将访问更大的表(上面的第 2 部分) 通过索引的 UserID,因此访问这些较大表的速度将类似于第 1 部分中的较小表?

使用 UserID 作为唯一主键(较短的表)或索引列(较大的表)让所有将成为联接的一部分的表 - 这似乎是合理的设计,以确保表获得良好的响应时间相当大 - 曾经达到 1 亿行吗?(不包括硬件等其他要求)。

想法?谢谢

4

2 回答 2

2

主键字段自动成为唯一索引的一部分,因此无需在此之上添加另一个索引。

where将索引放置在、join和/或order by子句中使用的任何字段上是一个很好的经验法则。

在速度方面,没有人可以肯定地说添加(或删除)索引是否会提高性能。对于简单/小型数据库,索引总是一个主要的加速。对于大型/复杂的模式,它们实际上会在某些情况下损害性能。您必须对系统进行基准测试以确保。但总的来说,索引 = 好。

于 2013-01-02T20:49:08.027 回答
1

如果将一列(或一组列)定义为表的主键,则将有一个与之关联的索引(它们)。请参阅有关Primary Key的MySQL 参考。

如果您正在实现具有JOINs 的查询,那么正如 Marc B 已经指出的那样,通常在您加入的列上添加索引(在您的情况下为 userId)是一个好习惯。

如果我的查询使用 UserID 进行联接(所有联接都关闭 UserID),这是否意味着联接将通过索引的 UserID 访问更大的表(上面的第 2 部分)

但是,正如您所问的,不确定 MySQL 是否会使用您创建的索引。根据查询的结构和结果集中可能的数据MySQL 查询优化器可能决定不使用您添加的索引。查找 MySQL 是否使用您的索引的方法是运行EXPLAIN查询。查看它的语法以及如何使用它来优化查询。您可以指导查询优化器使用某些索引这可能会节省查询计划分析和查询执行性能的时间,但我建议您运行多个测试以确保您实施的索引确实更好。您还应该记住,随着表中数据的增长,您的查询可能会降低性能,因此您应该定期检查查询的性能并安排索引。

如果查询中的第二个表将始终在 userId 字段上进行查询,那么您不妨利用MySQL 5.1 及更高版本提供的分区支持。在后台将主表中的分片记录分区为多个表,如果您遵循其规则,则可以真正提高查询的性能。

于 2013-01-02T21:26:29.940 回答