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_period
및 deal_type
개의 열을 인덱싱했습니다. 내가 이해하는 것으로부터 DB는이 열 내의 값에 대한 BTREE 인덱스를 생성합니다.
price_period
항상 중 하나입니다
NULL, h, d, w, m, y
을
deal_type
열은 항상이 될 것입니다 (시간, 일, 주, 월, 년).
offer
또는
demand
.
질문 : 난 단지 값의 미리 정의 된, 작은 범위의 값을 포함 할 열 집합이있는 경우, 그것은 더 나은 (성능 현명한는) 그들에 대해 별도의 테이블을 만들고 해외 사용하는 것입니다 키를 사용하여 열을 인덱싱하지 않습니까? 편집 : 추가 연구를 통해 이제는 외래 키가 단순히 참조 도구 일 뿐이며 성능이 아니라는 것을 알게되었습니다. 색인을 생성 할 수도 있고 색인화 할 수도 있습니다. 그러나 색인 된 외래 키 (숫자)는 짧은 문자열 색인을 생성하는 것보다 효과가 있습니까?
답변 해 주셔서 감사합니다. 쿼리는 아무 것도 입력하지 않은 채로 실행될 수 있습니다. 이 프로젝트는 아직 생산 단계에 있지 않습니다. 쿼리에 사용 된 필드의 조합을 저장하는 테이블을 만드는 것이 좋은 전략이 될 수 있습니다. 그리고 일부 사용법이 가장 많이 사용되는 테이블을 결정하고이를 기반으로 인덱스를 만드는 것이 좋습니다.(cookbok를 확인해 보겠습니다. 감사합니다.) 제외 : 근접 검색뿐 아니라 제목 및 설명 전체에 대해 FULLTEXT 검색을 제공하므로 검색 기능과 관련하여 또 다른 문제가 있습니다. – PeterTheLobster
'MATCH'가 포함되어 있다면 _only_'FULLTEXT' 인덱스가 사용된다는 것을 명심하십시오. –
쿼리를 수집하는 방법에 대해서는 "느린 로그"및 "일반 로그"를 참조하십시오. –