Answers:
是的,这可能会导致问题。
如果模块要对添加索引的列执行某项操作,它将删除其自身的索引,然后执行其打算执行的任何操作。
究竟会发生什么取决于您的数据库类型和实际执行的操作。例如,重命名该列将在MySQL上正常工作,但在PostgreSQL上将失败。但是,如果尝试删除该列(可能是在将数据迁移到其他表/列之后),则它将失败。
至少对于次要更新而言,发生这种情况的机会相对较低(但是,这取决于实际的模块。但是,我通常不添加任何可能破坏次要版本的更改),但这是可能的。
我的建议是您尝试与模块维护者一起工作。如果有问题的查询来自模块本身,那么如果您提供了补丁程序,维护者可能会很乐意添加索引。在添加索引之前和之后,提供有问题的查询的DESCRIBE输出。还提供了用于更新架构的补丁(包括用于为现有安装设置它的更新功能)。
积极从事与性能相关的事情并且做得很好的人很容易被抓住,这里有一个例子:http : //drupal.org/node/983950
如DatabaseSchema_pgsql :: changeField和db_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上尝试过。
除此之外,我不知道数据库索引可能还有其他问题。
关于将索引添加到从另一个模块创建的数据库表中,我不建议这样做,因为:
如果数据库表是从另一个模块(核心模块或第三方模块)创建的,则建议打开该模块的功能请求,并提供使用新索引的用例;如果存在任何性能问题,则添加索引可能是需要做的事情。
如果要向从另一个模块创建的表中添加索引到您自己的站点,那么在每次更新模块时以及在将其安装到自己的站点中之前,要做好对自定义模块所做的任何更改的准备。
您可以决定额外的工作是否值得您获得性能。就我个人而言,我认为这不值得。