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

qaz*_*wsx 6 mysql indexing database-performance

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

SELECT c1, c2 FROM t WHERE c3='foobar';
Run Code Online (Sandbox Code Playgroud)

Ray*_*Ray 10

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

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

查询的覆盖索引将为您的需求提供最佳性能,但是使用任何索引都会牺牲一些插入速度.牺牲多少取决于您的应用程序的配置文件.如果你从表中大部分时间阅读它并不重要.如果您只有几个索引,即使适度的写入负载也无关紧要.您桌子的有限存储空间也可能发挥作用......您需要对权衡做出最终评估,如果它是明显的.好消息是它不断受到打击.通常,添加索引不会以指数方式减慢插入,只是线性地减慢.

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

  1. 如果c3是表t的主键,则无法在查询中做任何更好的事情,以使索引更快.
  2. 假设c1是你的主键t:

    ALTER TABLE t ADD INDEX covering_index (c3,c2);  
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果c1不是你的pk(也不是c2),请使用:

    ALTER TABLE t ADD INDEX covering_index (c3,c2,c1);  
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果c2是你的PK,请使用:

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

    ALTER TABLE t ADD INDEX a_point_index (c3);  
    
    Run Code Online (Sandbox Code Playgroud)


Bar*_*chs 6

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

CREATE INDEX c3_index ON t(c3)
Run Code Online (Sandbox Code Playgroud)

  • 使用mysql`CREATE INDEX`是一个映射到`ALTER TABLE <table> ADD INDEX`的别名,可以正常工作. (2认同)