在MySQL中建立索引的约束

时间:2010-07-14 16:25:45

标签: mysql indexing

您好我将索引我的数据库表。我正在遵循的当前约束是索引在我的查询中“where”子句中最常用的列。这是正确的约束还是要遵循任何其他约束或检查?索引如何影响整个数据库?

3 个答案:

答案 0 :(得分:2)

在WHERE子句中经常使用的字段上使用索引是正确的。其他几个地方使用它们:

  1. 外键字段(用于连接)。
  2. 您用于ORDER BY的字段。
  3. 您用于GROUP BY的字段。
  4. 至于索引如何影响您的数据库,它们(通常)会更快地进行查询,插入和更新速度稍慢,当然会增加数据库的大小。假设数据库大小不是问题,通常可以归结为查询性能和插入性能之间的权衡。

答案 1 :(得分:0)

您还可以使用索引来防止重复数据,也就是说,您可以创建唯一索引。当您有一些不属于主键的列但它仍然需要是唯一的时,这很有用。一个很好的例子是当您使用surrogate key作为表的主键时,但其他一些列也必须是唯一的。

至于索引如何影响整个数据库,索引主要用于数据完整性保证和性能。索引可能导致问题的地方是加载大量数据(即通过批量加载或其他方式),因为每次加载记录时索引都必须更新。有一些方法可以关闭它,这是在加载大量数据时经常要做的事情,但需要权衡的是你必须确保数据是正确的,因为如果不是,你试图重新启用操作失败的索引。

至于添加更多索引是否会影响性能,取决于您已经拥有多少索引。您拥有的索引越多,优化器在决定使用哪个索引时必须做的工作就越多。而且,它取决于表的大小,列数等。

在确定索引影响时,强烈建议的一件事是查看查询计划以确定正在使用哪个索引。如果您试图使给定的查询运行得更快,这将告诉您索引是否有帮助。

答案 2 :(得分:0)

索引的两个原因,查询/ DML的性能以及强制执行约束。

对于前者:

必须维护索引...必须插入新记录,移动更改,删除删除。对于每个针对表的DML,每个索引也有一个。具有8个索引的表意味着每个DML(粗略地)完成了8倍以上的工作。

在索引数据中“有一个地方可去”。 2必须介于1和3之间。如果没有新值的空间,则存在块拆分(读取:开销)。

您不应该索引可能位于where子句中的每个列。高度分散的数据中的低基数列或范围扫描通常不会使用索引。大多数情况下,RDBMS每个表一次只能使用一个索引。 (在某些情况下,索引可以相互连接)。因此,一些索引需要在多个列上。

评论回应:

首先,如果你有where子句,其中包含columnA和columnB。并且你有两个关于colA的索引和另一个关于colB的索引...优化器可能会根据谓词的选择性和索引本身选择使用其中一个。另一个谓词只是对索引扫描结果和结果表访问的过滤器。你将会犁过比需要更多的表格块......如果这两个索引都没有足够的选择性,那么无论如何你最终会得到一个FTS。

但是如果你经常需要colA和colB in where子句,你可以同时在两个列上建立一个索引。现在,两个谓词都将用于将结果表块访问限制为仅包含所需行的那些。

现在领先的专栏变得很重要。