我在数据库中有一个字段几乎是唯一的:98% 的时间值是唯一的,但它可能有一些重复。我不会在这个领域做很多搜索;一个月说两次。该表目前有约 5000 条记录,每月将增加约 150 条记录。
这个字段应该有索引吗?
我正在使用 MySQL。
我在数据库中有一个字段几乎是唯一的:98% 的时间值是唯一的,但它可能有一些重复。我不会在这个领域做很多搜索;一个月说两次。该表目前有约 5000 条记录,每月将增加约 150 条记录。
这个字段应该有索引吗?
我正在使用 MySQL。
我认为“几乎独一无二”可能是一个红鲱鱼。数据要么是唯一的,要么不是唯一的,但这并不能确定您是否出于性能原因对其进行索引。
5000条记录真的不多,不管有没有索引,搜索还是很快的。以这样的插入速度,你需要 3 年才能获得 10000 条记录,这仍然不多。
我个人不会费心添加索引,但如果你这样做也没关系。
在决定添加索引时,您必须考虑的是插入速度和选择速度之间的权衡。
如果没有索引,select
在该字段上执行操作意味着 MySQL 必须遍历每一行并读取每个字段。添加索引可以防止这种情况。
索引的缺点是每次插入数据时,除了添加数据之外,数据库还必须更新索引。这通常是一个很小的开销,但如果您有大量索引并且正在执行大量写入,您会真正注意到它。
当您在数据库中获得这么多行时,无论如何您都需要一个索引,否则您的选择将花费一整天的时间,但这只是需要注意的事情,这样您就不会最终在字段上添加索引“只是以防我需要”
那根本不是很多记录。我不会费心在该表上创建任何索引。该字段的相对唯一性无关紧要 - 即使在多年前的商品硬件上,我希望对该表的查询只需几分之一秒。
您可以使用一般的经验法则:当它成为问题时进行优化。只是在您发现需要索引之前不要使用索引。
从您所说的来看,这听起来并不像索引是必要的。经验法则是 SELECTS 中大量使用索引字段来加速搜索,这反过来(可以)减慢 INSERTS 和 UPDATES。
在像你这样小的记录集上,我认为无论哪种方式你都不会看到太多真实世界。
如果您每月只对其进行两次搜索并且它只有几行,那么我会说不要索引它。它几乎没有用。
这真的是一个判断电话。有了这么小的表,你可以在没有索引的情况下快速搜索,所以你可以不用它。
另一方面,创建您并不真正需要的索引的成本非常低,因此不这样做并不会为自己节省太多。
此外,如果您确实创建了索引,那么如果您突然开始每周获得 1000 条新记录,那么您将获得保障。可能您对这种情况有足够的了解,可以肯定地说这永远不会发生,但是在您最不期望的时候,需求确实有一种改变的方式。
编辑:就不断变化的需求而言,要考虑的是:如果数据库确实增长并且您稍后发现您确实需要索引,您可以简单地创建索引并完成吗?或者您是否还需要更改大量代码以使用新索引?
不,记录不多,不会经常查询。无需索引。
It depends. As others have responded, there's a trade off between table update speed and selection speed. Table update includes inserts, updates, and deletes on the table.
One question you didn't address. Does the table have a primary key, and a corresponding index? A table with no indexes usually benefits form having at least one index. The most common way of getting that index is to declare a primary key, and rely on the DBMS to generate an index accordingly.
If a table has no candidates for primary key, that usually indicates a serious flaw in table design. That's a separate issue and should get a spearate discussion.