MySQL INNODB优化和索引

时间:2013-01-02 20:42:16

标签: mysql database

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

  1. 我有许多使用UserID作为主键的表。所有这些表对于每个用户将具有1行,因此将以相同的速率增长。看到它们将通过主键(UserID)访问我认为没有必要索引此键,因为每个键都是唯一的。

  2. 我还有一些表将增量号作为主键,UserID将是第二列。对于这些表,第二列中将有多个UserID实例。 (每个UserID都有很多朋友,每个朋友都列在不同的行上)。我希望这些表增长很长,但不是很宽,因此不大于GB。

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

    使用UserID将所有表作为Joins的一部分作为唯一的主键(较短的表)或索引的列(较大的表) - 这看起来是合理的设计,以确保表格的良好响应时间要变得非常大 - 永远进入100万个行? (不包括HW等其他要求)。

    想法? THX

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

  

如果我的查询使用UserID for Joins(所有联接UserID)这意味着Joins将通过索引的UserID访问更大的表(上面的第2部分)

但是,正如您所问,不确定MySQL是否会使用您创建的索引。根据查询结构和结果集中的可能数据MySQL Query Optimizer可能决定不使用您添加的索引。查找MySQL是否使用索引的方法是运行EXPLAIN查询。请参阅its syntaxhow to use it to optimize the queries。您可以将查询优化器引导到use certain indexes,这可以节省查询计划分析和查询执行性能的时间,但我建议您运行多个测试以确保您实施的索引真的更好。您还应该记住,随着表中数据的增长,您的查询性能可能会降低,因此您应该定期检查查询的性能并排列索引。

如果将始终在userId字段中查询查询中的第二个表,那么您可能还想利用MySQL 5.1以后的Partitioning support。将主表中的分片记录分区为幕后的几个表,如果遵循其规则,可以真正提高查询的性能。

相关问题