今天有人问我什么时候不想在表上创建 SQL 索引。
我唯一能想到的是当你不需要一个(即一张小桌子)时。这个答案感觉不对。何时应该使用索引以及何时不应该使用索引是否存在阈值?
当不在表上创建索引时,需要考虑很多事情。
首先,您可以创建很多可能的索引。例如,您可以创建一个索引,不仅包含表中的每一列,还包含列的每个排列(因为索引中的列排序确实很重要)。随着列数的增加,这可能是大量索引。
每个索引都带有许多以不同方式降低性能的东西。例如,它们可能会占用可用的内存/磁盘空间。可能比这更糟糕的是,索引需要在其下面的表更新时更新。这意味着表中的每个插入/更新/删除都可以触发索引更新。当您有更多索引时,需要更新的索引也更多,这可能会降低 CUD 操作的性能,并且如果您经常执行这些操作,可能会降低服务器性能。
由于这种性能影响,您希望避免“无用”索引。用于每个查询的索引通常都很好,但是对于 <1s 的查询,每天只使用一次的索引可能是无用的。在尝试确定哪些索引足够有用以及哪些索引的性能优势大于性能损失时,这完全是一种权衡。
你可以用另一个问题来回答它:什么时候需要索引?
如果要搜索条目,则需要索引以更快地获得结果。例如,如果列在 where 子句中使用。当然,您可以尝试索引所有内容,但索引会导致您使用额外的内存/硬盘。因此,您只需索引用于查找行的列。
例如,MySQL 在尝试查找行时正在读取哪些行,您可以使用EXPLAIN 命令进行分析。
这有帮助吗?
经验法则是,在小表(少于大约 100'000 行)上删除除主键上的唯一索引之外的所有索引。
此外,如果该列不是用于搜索目的(例如员工的薪水),则不适合使用索引。