【问题标题】:In MySQL, how to build index to speed up this query?在 MySQL 中,如何建立索引来加速这个查询?
【发布时间】:2012-10-14 14:42:42
【问题描述】:

在 MySQL 中,如何建立索引来加速这个查询?

SELECT c1, c2 FROM t WHERE c3='foobar';

【问题讨论】:

标签: mysql indexing database-performance


【解决方案1】:

要真正给出答案,看看您是否已经有现有索引会很有用,但是...

所有这一切都假设表 't' 存在并且您需要添加一个索引,并且您当前在主键上只有一个索引或根本没有索引。

查询的覆盖索引将为您的需求提供最佳性能,但使用任何索引都会牺牲一些插入速度。牺牲的重要性取决于您的应用程序的配置文件。如果您主要从表格中阅读,那将无关紧要。如果您只有几个索引,那么即使是适度的写入负载也无关紧要。您的桌子的有限存储空间也可能会发挥作用......您需要对权衡进行最终评估,以及是否值得注意。好消息是它经常受到打击。通常,添加索引不会以指数方式减慢插入速度,只会以线性方式减慢速度。

无论如何,以下是最佳选择性能选项:

  1. 如果 c3 是表 t 的主键,那么您在查询中不能做任何更好的事情来提高索引速度。
  2. 假设 c1 是你的主键 t:

    ALTER TABLE t ADD INDEX covering_index (c3,c2);  
    
  3. 如果 c1 不是你的 pk(c2 也不是),使用这个:

    ALTER TABLE t ADD INDEX covering_index (c3,c2,c1);  
    
  4. 如果 c2 是您的 PK,请使用:

    ALTER TABLE t ADD INDEX covering_index (c3,c1);  
    
  5. 如果磁盘空间或插入速度是一个问题,您可以选择做一个点索引。你会牺牲一些性能,但如果你插入很重,它可能是正确的选择:

    ALTER TABLE t ADD INDEX a_point_index (c3);  
    

【讨论】:

  • 通常索引的顺序应该是WHERE列在前,ORDER列在后。没有理由对过滤或排序标准中不涉及的数据列进行索引。创建大量多级索引只会让您的 INSERT 操作在您添加更多数据时变得极其缓慢。
  • @tadman 避免使用覆盖索引来提高性能的点查找。覆盖索引是包含您选择中的所有项目的索引(以及您要优化搜索的where 中的项目)。阅读:mysqlperformanceblog.com/2006/11/23/…
  • @Ray 我的问题的一个小变种:t(c1, c2) 作为复合键,我做的更重要的 SELECT 查询是 SELECT c1, c2 FROM t WHERE c2='Foobar';' Given that, would it mean that i basically already have the best performance possible -- (c1, c2)` 已经因为PK而索引?
  • @user1664196 不。如果您的复合 pk 是 (c2, c1) 对于该查询,您将拥有最佳索引。看起来没有什么不同,但确实如此。
  • 是否批量创建索引会有所不同,即。 (c3,c2,c1) 还是一个接一个?
【解决方案2】:

在您搜索的列上建立索引,因此在这种情况下,您必须在字段 c3 上添加索引:

CREATE INDEX c3_index ON t(c3)

【讨论】:

  • 使用 mysql CREATE INDEX 是映射到 ALTER TABLE <table> ADD INDEX 的别名,两者都可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2018-11-30
相关资源
最近更新 更多