在MySQL中,如何构建索引以加速此查询?
SELECT c1, c2 FROM t WHERE c3='foobar';
答案 0 :(得分:10)
要真正给出答案,查看您是否已有现有索引会很有用,但是......
所有这一切都假设表't'存在并且您需要添加索引,并且您当前只有主键上的单个索引或根本没有索引。
查询的覆盖索引将为您的需求提供最佳性能,但是对于任何索引,您都会牺牲一些插入速度。牺牲多少取决于您的应用程序的配置文件。如果你从表中大部分时间阅读它并不重要。如果您只有几个索引,即使适度的写入负载也无关紧要。您桌子的有限存储空间也可能发挥作用......您需要对权衡做出最终评估,如果它是明显的。好消息是它不断受到打击。通常,添加索引不会以指数方式减慢插入,只是线性地减慢。
无论如何,您可以选择最佳选择:
假设c1是您的主键t:
ALTER TABLE t ADD INDEX covering_index (c3,c2);
如果c1不是你的pk(也不是c2),请使用:
ALTER TABLE t ADD INDEX covering_index (c3,c2,c1);
如果你的PK是c2,请使用:
ALTER TABLE t ADD INDEX covering_index (c3,c1);
如果磁盘空间或插入速度有问题,您可以选择执行点索引。你会牺牲一些表现,但如果你插入重量,它可能是正确的选择:
ALTER TABLE t ADD INDEX a_point_index (c3);
答案 1 :(得分:6)
在您搜索的列上构建索引,因此在这种情况下,您必须在字段c3
上添加索引:
CREATE INDEX c3_index ON t(c3)