将索引添加到Drupal数据库是否安全?


12

我一直在搜索和阅读有关此内容的信息,但对于将索引添加到Drupal表(核心和贡献)的主题,我还没有看到任何明确的定义。

我主要担心的是,当您更新核心代码或贡献代码并且发生模式更改时,任何自定义索引会发生什么。在这种情况下会发生什么?

编辑:

我认为某些情况可能会有所帮助。我主要关心的是向表中添加索引以调整站点性能(查询显示在缓慢的查询日志中,显示缓慢的页面等)。这可能涉及向其他人的模块中的表添加索引。例如

  1. 我安装模块 foo
  2. 模块foo创建表 foo
  3. 我向表添加索引 foo
  4. 模块foo具有更改架构的更新

怎么了?

Answers:


7

是的,这可能会导致问题。

如果模块要对添加索引的列执行某项操作,它将删除其自身的索引,然后执行其打算执行的任何操作。

究竟会发生什么取决于您的数据库类型和实际执行的操作。例如,重命名该列将在MySQL上正常工作,但在PostgreSQL上将失败。但是,如果尝试删除该列(可能是在将数据迁移到其他表/列之后),则它将失败。

至少对于次要更新而言,发生这种情况的机会相对较低(但是,这取决于实际的模块。但是,我通常不添加任何可能破坏次要版本的更改),但这是可能的。

我的建议是您尝试与模块维护者一起工作。如果有问题的查询来自模块本身,那么如果您提供了补丁程序,维护者可能会很乐意添加索引。在添加索引之前和之后,提供有问题的查询的DESCRIBE输出。还提供了用于更新架构的补丁(包括用于为现有安装设置它的更新功能)。

积极从事与性能相关的事情并且做得很好的人很容易被抓住,这里有一个例子:http : //drupal.org/node/983950


2

DatabaseSchema_pgsql :: changeFielddb_change_field()中所报告

重要说明:为了保持数据库的可移植性,您必须显式重新创建所有使用已更改字段的索引和主键。

这意味着您必须在调用db_change_field()之前使用db_drop_ {primary_key,unique_key,index}()删除所有受影响的键和索引。要重新创建键和索引,请将键定义作为可选的$ new_keys参数直接传递到db_change_field()。

例如,假设您有:

$schema['foo'] = array(
  'fields' => array(
    'bar' => array('type' => 'int', 'not null' => TRUE)
  ),
  'primary key' => array('bar')
);

并且您想要将foo.bar更改为serial类型,将其保留为主键。正确的顺序是:

db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
  array('type' => 'serial', 'not null' => TRUE),
  array('primary key' => array('bar'))
);

对于Drupal 7,报告了类似的代码。

请记住,以我的经验,您不能删除使用串行字段的主键。在Drupal 6上,每次尝试都出现错误。我没有在Drupal 7上尝试过。

除此之外,我不知道数据库索引可能还有其他问题。

关于将索引添加到从另一个模块创建的数据库表中,我不建议这样做,因为:

  • 如果模块本身未创建该索引,则模块不会为要更改的字段删除索引。该模块将无法执行此操作,因为它不知道索引的名称。
  • 修改另一个模块创建的数据库表绝不是一个好主意,即使在该模块是核心模块的情况下也是如此。如果存在另一个更改同一表的模块,这些模块如何处理彼此之间的任何冲突,或者如何与核心模块应用于其自己的数据库的更改进行冲突?

如果数据库表是从另一个模块(核心模块或第三方模块)创建的,则建议打开该模块的功能请求,并提供使用新索引的用例;如果存在任何性能问题,则添加索引可能是需要做的事情。

如果要向从另一个模块创建的表中添加索引到您自己的站点,那么在每次更新模块时以及在将其安装到自己的站点中之前,要做好对自定义模块所做的任何更改的准备。
您可以决定额外的工作是否值得您获得性能。就我个人而言,我认为这不值得。


谢谢。如果我向表中添加索引以应对缓慢的查询,而不仅仅是对自己模块的更改,这将如何工作?如果有机会,我将尝试修改问题,使其更加清楚。
mpdonadio

3
您也可以考虑使用DB Tuner,它很容易知道要创建哪些索引。
tostinni 2011年

@tostinni是的,这个问题几乎与实施DB Tuner的建议直接相关。
mpdonadio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.