0

전체 텍스트 인덱스를 사용하여 컨텐트 (텍스트) 필드를 검색하는 MySQL 및 PHP로 작성된 사용자 정의 CMS의 코드베이스를 상속 받았습니다. 당신이 볼 수 있듯이텍스트 열에 대해 두 개의 전체 텍스트 인덱스가 실제로 필요합니까?

CREATE TABLE `stories` (
    `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `headline` varchar(255) NOT NULL DEFAULT '', 
    `subhead` varchar(255) DEFAULT NULL, 
    `content` text NOT NULL, 
    PRIMARY KEY (`story_id`), 
    FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`), 
    FULLTEXT KEY `headline` (`headline`), 
    FULLTEXT KEY `subhead` (`subhead`), 
    FULLTEXT KEY `content` (`content`) 
) ENGINE=MyISAM; 

은 전체 텍스트 인덱스가 일반적인 방법으로 만들어 지지만 각 열을 개별적으로 추가됩니다 데이터베이스 구조를 분석 할 때 나는 모든 관련 테이블이 다음과 같은 방식으로 (간체 예)에서 만든 것을 발견 뿐만 아니라 나는 두 가지 다른 지표를 창조한다고 믿는다.

나는 이전 개발자에게 연락을했고, 이것이 전체 텍스트 색인을 만드는 "적절한"방법이지만, 인터넷에서 발견 된 모든 단일 예에 따르면 그러한 요구 사항은 없으며 이것으로 충분할 것입니다 :

CREATE TABLE `stories` (
    `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `headline` varchar(255) NOT NULL DEFAULT '', 
    `subhead` varchar(255) DEFAULT NULL, 
    `content` text NOT NULL, 
    PRIMARY KEY (`story_id`), 
    FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`) 
) ENGINE=MyISAM; 

표는 80,000 행을 가지고 있으며 (전체 데이터베이스가 10기가바이트에 가까운) 관리가 점점 하드되고 그래서 불필요한 데이터를 제거하고 싶습니다.

미리 감사드립니다.

+0

답변에 직접 관계가있는이 색인이나 색인을 어떻게 쿼리합니까? 예를 들어 콘텐츠 만 검색하는 쿼리가 있습니까? – Steve

+0

사실 예, 검색 기능을 사용하면 검색을 수행하는 데 사용할 필드를 정의 할 수 있지만 MATCH() 문으로 처리되는 내 지식 (및 CMS의 관련 PHP 코드)은 다음과 같습니다. SELECT * 이야기에서 어디서 (내용) 일치 .. – Proteo

답변

0

직접 알아내는 방법은 실제로 어떤 인덱스가 사용되는지 확인하기 위해 쿼리 (일치)와 함께 EXPLAIN을 사용하는 것입니다. 인덱스를 사용하지 않고 느린 쿼리가있는 경우 인덱스를 만들거나 수동으로 index_hint를 사용하도록 지시 한 다음 EXPLAIN을 다시 시도하여 인덱스가 사용되는지 확인하십시오.

사용자가 검색 할 단 하나의 열만 지정할 수 있고 그 열이 색인 된 열의 목록에서 첫 번째 또는 유일한 색인이 아닌 경우 쿼리/일치는 인덱싱되지 않은 순차 검색. 즉, 인덱스가 (headline, subhead, content) 나는 3 개의 열 모두를 사용하거나 headline 또는 headlinesubhead을 사용하는 검색에 인덱스를 사용할 예정이지만 하위 헤드는 사용할 수 없습니다. 콘텐츠가 아닙니다. 나는 잠시 후에 그것을하지 않았으므로 요즘 뭔가 달라질 수 있습니다. EXPLAIN은 무슨 일이 일어나는지 밝혀야합니다.

EXPLAIN을 사용하여 가능한 모든 쿼리를 검사하고 그 중 하나에서 인덱스를 사용하지 않는다면 필요하지 않습니다.