我在设计MySQL数据库..。
问题:如果我在上面第2部分(用户in /第二列)中的表上添加了一个索引,如果我的查询使用的是UserID for Joins (所有连接都是UserID),这是否意味着joins将通过索引UserID访问较大的表(第2部分),因此访问这些较大的表的速度将与第1部分中的较小的表类似?
使用UserID作为唯一的主键(较短的表)或索引列(较大的表)的所有表都将是Joins的一部分--这是否是一个合理的设计,以确保如果表相当大,那么良好的响应时间--一直到1亿行?(不包括其他规定,如HW)。
有什么想法?thx
发布于 2013-01-02 20:49:08
主键字段自动成为唯一索引的一部分,因此不需要在此基础上添加另一个索引。
将索引放在where、join和/或order by子句中使用的任何字段上是一个很好的经验规则。
就速度而言,没有人能确定添加(或删除)索引是否会改善性能.对于简单/小的DB,索引总是一个主要的加速。对于大型/复杂的模式,它们实际上会在某些场景中损害性能。您将不得不对您的系统进行基准测试以确保。但总的来说,指数=好。
发布于 2013-01-02 21:26:29
如果一列(或一组列)被定义为表的主键,则将有一个与其相关联的索引(它们)。参见MySQL对主键的引用。
如果您正在实现具有JOIN的查询,那么正如Marc B已经指出的,在您所加入的列上添加索引通常是一个很好的做法(在您的例子中是userId)。
如果我的查询使用的是UserID for Joins (所有连接都离开UserID),这是否意味着joins将通过索引UserID访问较大的表(上面的第2部分)
但是,正如您已经问过的,不确定MySQL是否会使用您创建的索引。根据查询的结构和结果集中可能的数据,MySQL查询优化器可能决定不使用您添加的索引。查找MySQL是否使用索引的方法是运行EXPLAIN查询。见其语法和如何使用它优化查询。您可以将查询优化器引导到使用某些索引,这可能会节省查询计划分析和查询执行性能方面的时间,但我建议您运行几个测试,以确保您所执行的索引确实更好。您还应该记住,随着表中数据的增长,查询的性能可能会降低,因此您应该定期检查查询的性能并安排索引。
如果查询中的第二个表总是在userId字段上查询,那么您最好利用MySQL 5.1提供的分区支持。在后台将主表中的切分记录划分为几个表,如果您遵循它的规则,那么它确实可以提高查询的性能。
https://stackoverflow.com/questions/14128845
复制相似问题