MySQL中索引需要遵循的约束

MySQL中索引需要遵循的约束,mysql,indexing,Mysql,Indexing,您好,我将为我的数据库表编制索引。我所遵循的当前约束是索引查询中“where”子句中最常用的列。这是正确的约束条件,还是需要遵循其他约束条件或检查条件??索引对整个数据库有何影响?您还可以使用索引来防止重复数据,也就是说,您可以创建唯一的索引。当您有一些列不是主键的一部分,但它仍然需要是唯一的时,这非常有用。一个很好的例子是当您使用A作为表上的主键时,但其他一些列也需要是唯一的 至于索引如何影响整个数据库,索引主要用于保证数据完整性和性能。索引可能导致问题的地方是在加载大量数据时(即通过批量加载

您好,我将为我的数据库表编制索引。我所遵循的当前约束是索引查询中“where”子句中最常用的列。这是正确的约束条件,还是需要遵循其他约束条件或检查条件??索引对整个数据库有何影响?

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

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

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


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

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

  • 外键字段(用于联接)
  • 用于“订购依据”的字段
  • 用于分组依据的字段

  • 至于索引将如何影响数据库,它们(通常)会使查询速度加快,插入和更新速度稍慢,当然还会增加数据库的大小。假设数据库大小不是一个问题,它通常归结为查询性能和插入性能之间的折衷。

    索引的两个原因,查询性能/DML和强制约束

    对于前者:

    必须维护索引。。。必须插入、移动、删除或删除新记录。对于表中的每个DML,每个索引也有一个DML。一个有8个索引的表意味着每个DML(大约)要多做8倍的工作

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

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

    评论回应:

    首先,如果您有where子句,其中有columnA和columnB。你有两个索引,一个在可乐上,另一个在可乐上。。。优化器可能会根据谓词和索引本身的选择性选择使用其中一种。另一个谓词只是索引扫描结果和结果表访问的过滤器。你将要费力地翻过比需要多得多的桌子块。。。如果这两个指数都没有足够的选择性,那么无论如何,你最终会得到一个富时指数

    但是,如果您经常需要在where子句中同时使用colA和colB,则可以同时在这两列上构建索引。现在,这两个谓词将用于将结果表块访问限制为仅包含所需行的表块


    现在,前导列变得很重要。

    好的,我在where子句中有一些varchar类型的列,如果我对其进行索引,这会影响性能吗?@sai-是的,这可能会使它们更快,但还涉及其他因素(表有多大,where子句中使用了哪些其他列,等等)。如果您想知道某个特定的查询,我将创建另一个问题,并发布您的代码和模式,以获得更深思熟虑的答案。+1:SELECT子句是可以使用索引的另一个地方,但这是最后一个考虑事项。部分原因是MySQL为索引分配的空间量有一个上限(MyISAM表为1000字节,InnoDB为767字节):我有一个问题,我们是否需要再次索引外键列??它们不是已经被索引了吗???@sai-是的,它们应该在MySQL中为InnoDB表自动创建。出于完整性考虑,我在where子句中有几个类型为varchar的列,如果我对它进行索引,会影响性能吗?你能介绍一下对多个列进行索引的方法吗?是索引设计的圣经。