Php MySQL关系与性能

Php MySQL关系与性能,php,mysql,yii,Php,Mysql,Yii,我在数据库的表之间创建关系 我读到索引会减慢写查询的速度,未使用的索引是无用的 要建立关系,需要将列作为外键(我使用的是InnoDb),以便将其链接到另一个表的主键 其中一些索引永远不会用于搜索查询,它们仅用于关系目的 我使用PHP和Yii框架,因此所有查询和写入都是基于代码的,并检查完整性(唯一性、存在性等) 如果这些关系能够在大数据环境中减缓我未来的查询速度,我真的会从中受益吗?这在很大程度上取决于您在表上运行的查询 第一:是的,每个索引都会减慢写入操作,因为必须在正确的位置添加新数据(索引

我在数据库的表之间创建关系

我读到索引会减慢写查询的速度,未使用的索引是无用的

要建立关系,需要将列作为外键(我使用的是InnoDb),以便将其链接到另一个表的主键

其中一些索引永远不会用于搜索查询,它们仅用于关系目的

我使用PHP和Yii框架,因此所有查询和写入都是基于代码的,并检查完整性(唯一性、存在性等)


如果这些关系能够在大数据环境中减缓我未来的查询速度,我真的会从中受益吗?

这在很大程度上取决于您在表上运行的查询

第一:是的,每个索引都会减慢写入操作,因为必须在正确的位置添加新数据(索引已排序)。 如果使用索引,这不是问题,因为它可以大大加快查找操作

但我们来看一个例子:
假设您有一个表
data1(id1,id2,一些文本)
和一个表
data2(id1,一些更多文本)
。假设索引
(id2,id1)
位于
data1
上,索引
id1
位于
data2
上。在这里,您必须在
data1
上添加索引
id1
,以添加
data1
data2
之间的关系。您可以通过将索引
(id2,id1)
更改为
(id1,id2)
来改进这一点。由于MySQL中的索引是前缀索引,因此您现在可以将
(id1,id2)
也用作索引
id1
,并将其用作外键。
但是,由于索引不再是索引的前缀,您也失去了使用索引进行只使用字段
id2
的查找的能力

如果添加索引,则应考虑以下内容:

  • 我在此表上运行的查询是什么?

    如果按多个列进行筛选,则应将它们放在一个索引中(MySQL对每个表和查询只使用一个索引)
  • 我需要外键吗?
    外键对于使数据库关心数据完整性非常有用。但您也应该尝试使用现有索引来建立关系,如果可能的话,可以通过更改多列索引的顺序来实现

如果没有表和查询的描述,您的问题纯粹是推测性的。我可以说,关系数据库可以有效地用于解决“大数据”问题,因此我想关系和索引在实践中至少有时可以很好地工作。索引可能永远不会在查询中使用,但会在JOIN语句中使用。索引是一种平衡行为。它会减慢写是的,但只会少量写。索引大大加快了读取速度。我看到查询从几小时减少到几秒钟。因此,它们对于一个好的数据库至关重要。就像巧克力,如果你吃得太多,你会生病。索引也一样,嘿。我对你的问题进行了编辑,以改进语法,使其更具可读性,同时删除了一些嘈杂的文本。你肯定应该考虑再次编辑你的问题,并通过链接显示你在哪里读过你提到的内容:)@FélixGagnon Grenier很抱歉,英语不是我的主要语言,我的语法也不完善,但我尽了最大努力。感谢您的编辑。我认为只有当您在所有行中只有不到1%的行包含1,而其余行包含零(或者相反)时,才值得使用索引。“MySQL只在每个表和查询中使用一个索引”您从哪里获得的垃圾信息?可能是4.3左右,但现在肯定不是了。@DavidSoussan我明白,优化器会根据实际查询选择一个承诺行数最少的索引。也许我写的有点让人困惑?MySQL选择的索引将最好地优化查询,并在每一步返回最少的行数。这与“仅使用1个索引”完全不同。手动输入只是理解查询优化程序和索引行为的起点。真正的理解需要多年的时间。同时,获取mysql工作台,它提供了解释输出的非常好的图形表示。任何人都需要知道的是,如果没有索引,您会得到表扫描,而它们会对您的性能造成更大的影响。@DavidSoussan您能提供一个链接,让我可以从中了解到这一点吗?这是我第一次读到MySQL在每个表中使用多个索引。如果MySQL可以同时使用多个索引,为什么会有人使用(非唯一的)多列索引,而不是为每列单独使用一个索引?@Davidsousan有趣的是,我一直认为MySQL总是只使用一个索引。这难道不是解释给你一个
可能的\u keys
列和一个
key
列告诉你优化器使用了什么吗?我的意思是,即使是MariaDB的Explain Analyzer工具()也将该列描述为“用于检索行的键的名称”,对我来说,这听起来像是单个键