정규화 된 데이터베이스 구조가 있으므로 설명하려고합니다.내 SQL 테이블에 적용 할 색인이 무엇인지 확실하지 않습니다.
3 테이블 :
- 프로파일
- 키워드
- keyword_profile
내 웹 사이트에 대한 모든 프로필은 연결된 키워드의 다양한 수를 가질 수있다. 모든 키워드는 키워드 표에서 ID 번호를 얻습니다. 모든 프로파일은 프로파일 테이블에서 ID 번호를 얻습니다. keyword_profile 테이블에는 profileID에 연결된 keywordID가있는 약 600,000 개의 행이 있습니다.
프로필 테이블의 ID 열에 PRIMARY 인덱스가 있습니다.
키워드 표의 ID 열에 PRIMARY 색인이 있습니다.
키워드 표의 내 키워드 이름 열에 UNIQUE 색인이 있습니다.
나는이 같은 keyword_profile 테이블에 PRIMARY 인덱스가 (PROFILE_ID, keyword_id는)
나는 keyword_profile 테이블
다음의 PROFILE_ID 컬럼에 인덱스가 : 나는 다음과 같은 쿼리를 실행할 때 (특정 키워드입니다 'dienst') :
EXPLAIN SELECT profiles.hoofdrubriek, profiles.plaats, profiles.bedrijfsnaam, profiles.gemeente, profiles.bedrijfsslogan, profiles.straatnaam, profiles.huisnummer, profiles.postcode, profiles.telefoonnummer, profiles.fax,profiles.email, profiles.website, profiles.bedrijfslogo
FROM profiles
INNER JOIN profile_dienst ON profiles.ID = profile_dienst.profile_id
INNER JOIN diensten ON profile_dienst.dienst_id = diensten.ID
WHERE (
diensten.dienst = 'Aannemersdiensten'
)
ORDER BY profiles.grade DESC , profiles.bedrijfsnaam
다음과 같은 결과가 나타납니다. 그것은 모든 600k 행을 검사합니다 !! 그게 내가 원하는 결과는 아니야. 내가 적용 할 수있는 인덱스는 무엇일까? 그러면 테이블 전체를 스캔하지 않을 것이다.
id - select_type - table - type - key - rows - Extra
1 - SIMPLE - diensten - const - dienst - 1 - Using temporary; Using filesort
1 - SIMPLE - profile_dienst - index - PRIMARY - 662000 - Using where; Using index
1 - SIMPLE - profiles - eq_ref - PRIMARY - 1 - Using where
도움 주셔서 감사합니다 !!
편집 : 추가 SHOW CREATE TABLE 결과 :
CREATE TABLE `diensten` (
`ID` mediumint(9) NOT NULL AUTO_INCREMENT,
`dienst` varchar(255) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `dienst` (`dienst`)
) ENGINE=MyISAM AUTO_INCREMENT=1903 DEFAULT CHARSET=utf8
CREATE TABLE `profile_dienst` (
`profile_id` varchar(20) NOT NULL,
`dienst_id` varchar(20) NOT NULL,
PRIMARY KEY (`dienst_id`,`profile_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE TABLE `profiles` (
`ID` varchar(255) NOT NULL DEFAULT '',
`username` varchar(255) DEFAULT NULL,
...more columns...,
`grade` int(5) NOT NULL,
PRIMARY KEY (`ID`),
KEY `IDX_TIMESTAMP` (`timestamp`),
KEY `IDX_NIEUW` (`nieuw`),
KEY `IDX_HOOFDRUBRIEK` (`hoofdrubriek`),
KEY `bedrijfsnaam` (`bedrijfsnaam`),
KEY `grade` (`grade`),
KEY `gemeente` (`gemeente`),
KEY `plaats` (`plaats`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
'(profile_id, dienst_id)와'(dienst_id, profile_id)'연관 테이블에서? –
그리고'dienst'에 대한 색인은'diensten' 테이블에 있습니까? –
영어 이름과 네덜란드 이름 사이에 약간의 혼란이 있다고 생각합니다. 나는 키워드를 대체 할 수 있다고 생각한다. – mucio