2011-06-10 4 views
1

나는 이메일이 특별한 그룹에 있다면 큰 데이터베이스를 가지고 있고 씹어야했다. 나는 테이블을 가져야했다.mysql이 엔트리가 존재하는지 확인하기 위해 선택한다.

첫 tabel 사용자

CREATE TABLE user (
    uid int(10) NOT NULL AUTO_INCREMENT, 
    kid int(3) NOT NULL, 
    Email varchar(255) DEFAULT NULL, 
    PRIMARY KEY (uid), 
    KEY kid (kid) 
) ENGINE=MyISAM 

및 테이블 이름 그룹

CREATE TABLE `group` (
    `vuid` int(10) NOT NULL AUTO_INCREMENT, 
    `uid` int(3) NOT NULL, 
    `vid` int(3) NOT NULL, 
    PRIMARY KEY (`vuid`) 
) ENGINE=MyISAM 

라고 모든 삽입을 위해 내가, 정의 VID와 내가 확인했다 이제 이메일 을 가진 사용자와의 경우 uid가 그룹 vid에 있습니다.

select a.email,b.vuid from user a, group b where a.email=\''.$email.'\' and a.kid=' . $kid.' and b.vid=' . $vid . ' and a.uid = b.uid limit 1')

와 mysql_fetch_assoc이 참인지 거짓인지 확인.

그러나 이것은 verry verry slow입니다. 속도를 높일 수있는 간단한 방법이 있습니까?

+0

이메일을 확인하는 이유는 무엇입니까? –

답변

2

오히려 테이블의 쉼표로 구분 된 목록을 사용하는 것보다 사용하여 시도해보세요 JOINON 절 (이 기록은 두 테이블에 존재하는지 확인하기 원하기 때문에이 경우, INNER JOIN이 가장 좋은 건입니다). 귀하의 질의를 형식화했으며 변경 사항은 대문자로되어 있습니다.

select 
    a.email, 
    b.vuid 
from 
    user a 
    INNER JOIN group b 
     ON a.uid = b.uid 
where 
    a.email=\''.$email.'\' 
    and a.kid=' . $kid.' 
    and b.vid=' . $vid . ' 
limit 1 

다음으로 색인을 확인하십시오. 색인이 b.uid 및 a.kid에 있는지 확인하십시오. 일반적으로 색인을 생성 할 수있는 값의 where 절을 확인하십시오. 고유 한 값을 가진 것은 후보입니다.

1

느린 경우 조회 열이나 외래 키 열에서 누락 된 색인이있을 수 있습니다.

+0

그래서 user.uid의 키 uid로 그룹을 편집해야 했습니까? – Roby

+0

외래 키로 사용중인 모든 열은 외래 테이블의 키와 동일하게 정의되어야하며 인덱스가 있어야합니다. 이 방법은 MySQL은 조인을 신속하게 처리 할 수 ​​있습니다. 그렇게하지 않으면 느린 테이블 스캔 방법을 사용하여 테이블을 조인해야합니다. – datasage

+0

: -/도와 주시겠습니까? ALTER TABLE 그룹과 같이 FOREIGN KEY (uid)를 추가하십시오. REFERENCES user (uid) ?? – Roby

1

는 수행

ALTER TABLE `group` ADD INDEX `uid`(uid); 
ALTER TABLE `user` ADD INDEX `email`(`Email`); 

이것은 당신의 속도 저하 문제를 해결해야한다.

관련 문제