it-swarm-ko.tech

Drupal 데이터베이스에 인덱스를 추가하는 것이 안전합니까?

나는 이것에 대해 검색하고 읽었지만 Drupal 테이블 (코어 및 contrib)에 인덱스를 추가하는 주제에 대해 결정적인 것을 보지 못했습니다.

나의 주요 관심사는 코어 또는 contrib 코드를 업데이트하고 스키마 변경이있을 때 모든 사용자 정의 색인에서 발생하는 것입니다. 이 경우 어떻게됩니까?

편집하다:

나는 어떤 맥락이 도움이 될 것이라고 생각합니다. 나는 주로 사이트 성능을 조정하기 위해 테이블에 인덱스를 추가하는 것에 관심이 있습니다 (질의가 느린 쿼리 로그에 표시되는 쿼리, 뷰가 느린 페이지 등). 여기에는 다른 사람의 모듈에있는 테이블에 색인을 추가하는 것이 포함될 수 있습니다. 예를 들어

  1. foo 모듈을 설치합니다
  2. Foo 모듈은 foo 테이블을 생성합니다
  3. foo 테이블에 색인을 추가합니다
  4. foo 모듈에 스키마를 변경하는 업데이트가 있습니다.

무슨 일이야?

12
mpdonadio

예, 문제가 발생할 수 있습니다.

모듈이 색인을 추가 한 열로 무언가를 수행하려는 경우 자체 색인을 제거한 다음 수행하려는 작업을 수행합니다.

정확히 어떻게 될지는 데이터베이스 유형과 실제로 실행 된 작업에 따라 다릅니다. 예를 들어, 열 이름 변경은 MySQL에서 잘 작동하지만 PostgreSQL에서는 실패합니다. 그러나 해당 열을 삭제하려고하면 (데이터를 다른 테이블/콜론으로 마이그레이션 한 후) 실패합니다.

이 문제가 발생할 가능성은 최소한 작은 업데이트 일 경우에는 상대적으로 낮습니다 (그러나 실제 모듈에 따라 다릅니다. 일반적으로 any 변경 사항을 추가하지 않습니다 사소한 릴리스로 인해 문제가 발생할 수 있지만 가능합니다.

내 제안은 모듈 관리자와 협력하려고한다는 것입니다. 문제가있는 쿼리가 모듈 자체에서 나온 경우 패치를 제공하면 관리자가 인덱스를 행복하게 추가 할 수 있습니다. 인덱스 추가 전후에 문제가있는 쿼리의 DESCRIBE 출력을 제공하십시오. 또한 스키마를 업데이트하는 패치를 제공하십시오 (기존 설치에 대해 설정하는 업데이트 기능 포함).

성능 관련 작업에 적극적으로 노력하고 있으며 위의 내용을 잘 수행하는 사람은 다음과 같습니다. http://drupal.org/node/98395

7
Berdir

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에서 시도하지 않았습니다.).

그 외에도 데이터베이스 인덱스와 관련하여 발생할 수있는 다른 문제는 없습니다.

다른 모듈에서 작성된 데이터베이스 테이블에 색인을 추가하는 방법에 대해서는 다음과 같은 이유로 권장하지 않습니다.

  • 모듈 자체가 해당 색인을 작성하지 않은 경우 모듈은 변경중인 필드에 대한 색인을 삭제하지 않습니다. 인덱스의 이름을 모르기 때문에 모듈이 그렇게 할 수 없습니다.
  • 모듈이 핵심 모듈 인 경우에도 다른 모듈에서 만든 데이터베이스 테이블을 수정하는 것은 좋은 생각이 아닙니다. 동일한 테이블을 변경하는 다른 모듈이있는 경우 모듈이 서로 충돌하거나 코어 모듈이 자체 데이터베이스에 적용하는 변경 사항을 어떻게 처리 할 수 ​​있습니까?

데이터베이스 테이블이 다른 모듈 (핵심 모듈 또는 타사 모듈)에서 작성되는 경우 모듈에 대한 기능 요청을 열어서 새 색인을 사용하는 사용 사례를 제공하는 것이 좋습니다. 성능 문제가있는 경우 인덱스를 추가하는 것이 좋습니다.

다른 모듈에서 작성된 테이블에 색인을 자신의 사이트로 추가하려는 경우, 모듈이 업데이트 될 때마다 그리고 자신의 사이트에 설치하기 전에 사용자 정의 모듈에 대한 변경 사항을 준비하십시오. .
추가 작업이 귀하가받을만한 가치가 있는지를 결정할 수있는 사람은 귀하입니다. 개인적으로, 나는 그것이 가치가 있다고 생각하지 않습니다.

2
kiamlaluno