这个问题说明了一切。我曾经为我在 WHERE 语句中使用的列放置索引以进行优化并帮助站点很好地扩展。我正在与我的同事交谈,他说最好不要放置这些索引并在需要时留出优化空间。您认为这里的最佳做法是什么?
4 回答
一如既往,答案是“视情况而定”。
如果 WHERE 子句以破坏索引的方式使用列,那何必呢?如果可能的话,你会想要重写那些。
插入时必须计算索引,因此需要权衡查询的成本。如果您主要阅读,那么索引可能是有意义的。如果您的数据库具有大量事务性,则索引会减慢 INSERT。尤其是批量上传。
我认为这里的最佳实践是最初放入一些索引,作为对需要哪些索引的最佳猜测。但在那之后,您想要实际衡量哪些查询速度较慢并为这些查询编制索引。也许你的 where 子句,甚至你的整个查询会随着需求的变化而变化。
这就像使用在一天中聚合查询时间的东西一样简单,比如pgfouine。
我不得不说不:简单地索引每一列并不是一个好习惯,因为它恰好出现在一个WHERE
子句中。
首先,如果您在特定WHERE
子句中有两列,您可能会决定是否在同一索引中同时索引以及将哪一列作为第一列。仅使用单个列,索引的选择ASCENDING
或DESCENDING
索引可能很重要。当同一张表参与许多查询,并且WHERE
子句中有很多列时,您是否希望仅仅因为列出现在子句中而拥有所有这些列以各种组合和顺序的大量索引WHERE
?不。
我想说的是设计索引时考虑到子句中使用了哪些列是一个好习惯,但最终,可能不会出现在子句中但出现在 a中的列可能对大多数索引更重要。您当然可以设计一些带有检查的索引,但一般来说,您会想要实际分析您的流程并查看哪些索引实际上对大部分工作负载有用。WHERE
WHERE
JOIN
不,这取决于色谱柱的选择性。例如,索引列 EMPLOYEE.GENDER 是没有用的。可能也不适用于 COLLEGE_STUDENT.YEAR_IN_SCHOOL_STATUS (4 个可能的值)。
如果有一些稀有值散布着一两个常见值,则可能有部分索引。
我肯定会索引查询中使用的任何字段,其中没有超过 10% 的行中的值。