8

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

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

2 回答 2

12

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

所有这一切都假设表 '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);  
    
于 2012-10-24T14:28:31.053 回答
7

在您搜索的列上构建索引,因此在这种情况下,您必须在 field 上添加索引c3

CREATE INDEX c3_index ON t(c3)
于 2012-10-24T14:29:22.813 回答