【发布时间】:2012-10-14 14:42:42
【问题描述】:
在 MySQL 中,如何建立索引来加速这个查询?
SELECT c1, c2 FROM t WHERE c3='foobar';
【问题讨论】:
-
你目前在
t上有哪些索引? -
@Bridge 如何检查存在哪些索引?
标签: mysql indexing database-performance
在 MySQL 中,如何建立索引来加速这个查询?
SELECT c1, c2 FROM t WHERE c3='foobar';
【问题讨论】:
t上有哪些索引?
标签: mysql indexing database-performance
要真正给出答案,看看您是否已经有现有索引会很有用,但是...
所有这一切都假设表 '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);
如果 c2 是您的 PK,请使用:
ALTER TABLE t ADD INDEX covering_index (c3,c1);
如果磁盘空间或插入速度是一个问题,您可以选择做一个点索引。你会牺牲一些性能,但如果你插入很重,它可能是正确的选择:
ALTER TABLE t ADD INDEX a_point_index (c3);
【讨论】:
WHERE列在前,ORDER列在后。没有理由对过滤或排序标准中不涉及的数据列进行索引。创建大量多级索引只会让您的 INSERT 操作在您添加更多数据时变得极其缓慢。
where 中的项目)。阅读:mysqlperformanceblog.com/2006/11/23/…
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而索引?
在您搜索的列上建立索引,因此在这种情况下,您必须在字段 c3 上添加索引:
CREATE INDEX c3_index ON t(c3)
【讨论】:
CREATE INDEX 是映射到 ALTER TABLE <table> ADD INDEX 的别名,两者都可以正常工作。