2016-10-09 1 views
0

My SQL 아마추어로서 나는 테이블 최적화 및 인덱스 사용과 관련하여 조언을 구하고 싶습니다.인덱스를 사용하여 검색 속도를 위해이 MySql 테이블을 최적화하는 방법은 무엇입니까?

사용자가 게시 한 광고가 포함 된 표를 고려하십시오. 표는 다음과 같은 구조를 가지고 (이것은 Laravel의 구현을하지만 코드가 매우 자명 생각) : 웹 사이트에

Schema::create('advertisements', function (Blueprint $table) { 
     $table->increments('id');  //PRIMARY KEY AUTOINCREMENTS 
     $table->text('images');  //TEXT 
     $table->string('name', 150); //VARCHAR(150) 
     $table->string('slug');  //VARCHAR(255) 
     $table->text('description'); 
     $table->string('offer_type',7)->nullable()->index(); 
     $table->float('price')->nullable(); 
     $table->string('deal_type')->nullable()->index(); 
     $table->char('price_period',1)->nullable()->index(); 
     $table->float('price_per_day')->nullable(); 
     $table->float('deposit')->nullable(); 

     $table->integer('category_id')->unsigned()->index(); 
     $table->foreign('category_id')->references('id')->on('categories'); 

     $table->integer('author_id')->unsigned()->nullable(); 
     $table->foreign('author_id')->references('id')->on('users'); 

     $table->timestamps(); 
    }); 

사용자는 다음과 같은 몇 가지 기준을 사용하여 위의 표에서 광고를 검색 할 수 있습니다 : price 범위, offer_type, price_period 또는 deal_type.

나는 알 수 있듯이 offer_type, price_perioddeal_type 개의 열을 인덱싱했습니다. 내가 이해하는 것으로부터 DB는이 열 내의 값에 대한 BTREE 인덱스를 생성합니다.

그러나이 값은 항상 미리 정의 된 세트에서 될 것 같습니다 예를 들어 - price_period 항상 중 하나입니다 NULL, h, d, w, m, ydeal_type 열은 항상이 될 것입니다 (시간, 일, 주, 월, 년). offer 또는 demand.

질문 : 난 단지 값의 미리 정의 된, 작은 범위의 값을 포함 할 열 집합이있는 경우, 그것은 더 나은 (성능 현명한는) 그들에 대해 별도의 테이블을 만들고 해외 사용하는 것입니다 키를 사용하여 열을 인덱싱하지 않습니까? 편집 : 추가 연구를 통해 이제는 외래 키가 단순히 참조 도구 일 뿐이며 성능이 아니라는 것을 알게되었습니다. 색인을 생성 할 수도 있고 색인화 할 수도 있습니다. 그러나 색인 된 외래 키 (숫자)는 짧은 문자열 색인을 생성하는 것보다 효과가 있습니까?

답변

1

인덱싱 플래그 및 기타 낮은 카디널리티 열은 일반적으로 쓸모가 없습니다. 예를 들어 테이블의 절반에 플래그 값이있는 경우 일 때 해당 플래그의 인덱스를 무시하고 단순히 전체 테이블을 스캔하면됩니다.

어떤 색인이 필요한지 판단하기 위해 실제로 조회가 필요합니다. 너의 힌트에 따라, 나는 어쨌든 찌르다. ...

"가격 범위, 제안 유형, 가격 _ 기간 또는 거래 유형"- 사용자가 최소 및 최대 가격을 제공한다고 가정합니까? 그런 다음 으로 끝나는 "복합"색인 price_per_day을 작성하십시오. 그들은 항상 다른 세 개의 기둥을 모두 지정합니까? 각 열에 대해 하나의 값이 있습니까? 예 위의 모든에,이 지수가 최적 인 경우 :

INDEX(over_types, price_period, deal_type, price_per_day) 

(최초의 3 열은 임의의 순서로 할 수 있지만, 범위에 적용되는 것은 마지막으로 할 필요가있다.)

사용자가 이러한 플래그 중 일부만 포함하거나 여러 값을 포함 할 수있는 경우 사용자가 더 복잡해집니다. 사용자가 요청한 사항을 확인하고 일반적인 쿼리를 기반으로 추가 색인을 조정하십시오. 빌드하려면이 index cookbook을 사용하십시오.

+0

답변 해 주셔서 감사합니다. 쿼리는 아무 것도 입력하지 않은 채로 실행될 수 있습니다. 이 프로젝트는 아직 생산 단계에 있지 않습니다. 쿼리에 사용 된 필드의 조합을 저장하는 테이블을 만드는 것이 좋은 전략이 될 수 있습니다. 그리고 일부 사용법이 가장 많이 사용되는 테이블을 결정하고이를 기반으로 인덱스를 만드는 것이 좋습니다.(cookbok를 확인해 보겠습니다. 감사합니다.) 제외 : 근접 검색뿐 아니라 제목 및 설명 전체에 대해 FULLTEXT 검색을 제공하므로 검색 기능과 관련하여 또 다른 문제가 있습니다. – PeterTheLobster

+0

'MATCH'가 포함되어 있다면 _only_'FULLTEXT' 인덱스가 사용된다는 것을 명심하십시오. –

+0

쿼리를 수집하는 방법에 대해서는 "느린 로그"및 "일반 로그"를 참조하십시오. –