我有一个相当常见的设置,我有一个标签和记录对表。查询它很慢,所以在我查询的标签列中添加索引有助于加快速度。
tag | site 123 | 456 789 | 101
我的问题是,将这两列的索引添加为一个索引是否有益。它永远不会被网站选中,这样做有什么好处?我也不能保证每次配对都是独一无二的而不做一些改变但如果我这样做会对性能有帮助吗?
典型的查询可能如下所示:
SELECTsite
,tag
FROMsitetags
WHEREtag
='123' ORtag
= '789'
答案 0 :(得分:5)
如果您始终按tag
搜索,则只需索引tag
列。
在未使用时将列添加到索引,在插入或更新记录时会引入不必要的开销,并且还会占用更多存储空间。
但是复合索引(tag
,site
)可以提供额外的优化,因为MySQL只需要读取索引来满足您的查询(EXPLAIN
通常将此优化标记为using index
)。
如果您的操作主要是读取而不是写入,那么使用复合索引可能不是一个坏主意。
如果tag
列具有高基数,这意味着它们的值很可能在每行之间不同。
但我建议你先咨询EXPLAIN
输出。
答案 1 :(得分:0)
如果这些是表格中唯一的列,那么答案是否定的,它不会加快您的查询速度,因为它无论如何都必须处理整个行。
如果没有,那么是的,在选定列上添加索引可以加快查询速度,因为优化器将能够选择该值而不实际处理整行。
通常,您应该只索引过滤的列。我建议在选定的列 上添加一个索引,如果你真的使用这种格式选择很多,如果没有,缺点(如慢插入)可以克服这些好处。
注意:您的典型查询实际上应如下所示:
WHERE tag IN('123','789')