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


12

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

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

편집하다:

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

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

무슨 일이야?

답변:


7

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

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

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

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

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

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


2

으로는보고 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에서는 시도하지 않았습니다.

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

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

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

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

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


감사. 내 모듈의 변경뿐만 아니라 느린 쿼리에 대처하기 위해 테이블에 인덱스를 추가하면 어떻게 작동합니까? 기회가 생기면 질문을 좀 더 명확하게 편집하려고 노력할 것입니다.
mpdonadio

3
또한 어떤 인덱스를 생성해야하는지 알기에 편리한 DB Tuner 사용을 고려할 수 있습니다.
tostinni

@ tostinni 예, 질문은 DB Tuner의 권장 사항 구현과 거의 직접 관련이 있습니다.
mpdonadio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.