Php MySQL关系与性能
我在数据库的表之间创建关系 我读到索引会减慢写查询的速度,未使用的索引是无用的 要建立关系,需要将列作为外键(我使用的是InnoDb),以便将其链接到另一个表的主键 其中一些索引永远不会用于搜索查询,它们仅用于关系目的 我使用PHP和Yii框架,因此所有查询和写入都是基于代码的,并检查完整性(唯一性、存在性等)Php MySQL关系与性能,php,mysql,yii,Php,Mysql,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对每个表和查询只使用一个索引) - 我需要外键吗?
外键对于使数据库关心数据完整性非常有用。但您也应该尝试使用现有索引来建立关系,如果可能的话,可以通过更改多列索引的顺序来实现
可能的\u keys
列和一个key
列告诉你优化器使用了什么吗?我的意思是,即使是MariaDB的Explain Analyzer工具()也将该列描述为“用于检索行的键的名称”,对我来说,这听起来像是单个键