2011-03-16 2 views
2

광택 캐시 서버에서이 쿼리를 SQL 서버에서 실행할 때.이 SQL 쿼리로 인해 서버가 죽는 이유는 무엇입니까?

select count(distinct email) from aiki_users, ocal_files where userid = 
     (select upload_user from ocal_files where upload_user = userid limit 1) 

80000 행

ocal_files 인 테이블> 30000 행>aiki_users 표 갖는.

서버를 종료합니다. 그것은 아약스를 통해 PHP 스크립트에서 호출됩니다. 나는 그것을 호출하는 페이지를 닫아야한다.

나는 그것이 반환 모르겠어요,하지만 난 내가하고 싶은 일을하고함으로써 그룹으로 작성되어야 함을 알고,하지만 난 방법을 모르겠어요.

aiki_users 테이블은 다음과 같다 : 나는 서버에 올바른 액세스 권한이없는

CREATE TABLE IF NOT EXISTS `aiki_users` (
    `userid` int(9) unsigned NOT NULL auto_increment, 
    `username` varchar(100) NOT NULL default '', 
    `full_name` varchar(255) NOT NULL, 
    `country` varchar(255) NOT NULL, 
    `sex` varchar(25) NOT NULL, 
    `job` varchar(255) NOT NULL, 
    `password` varchar(100) NOT NULL default '', 
    `oauth_passcode` varchar(255) NOT NULL, 
    `oauth_token` varchar(255) NOT NULL, 
    `oauth_token_secret` varchar(255) NOT NULL, 
    `usergroup` int(10) NOT NULL default '0', 
    `email` varchar(100) NOT NULL default '', 
    `avatar` varchar(255) NOT NULL, 
    `homepage` varchar(100) NOT NULL default '', 
    `first_ip` varchar(40) NOT NULL default '0', 
    `first_login` datetime NOT NULL, 
    `last_login` datetime NOT NULL, 
    `last_ip` varchar(40) NOT NULL, 
    `user_permissions` text NOT NULL, 
    `maillist` int(1) NOT NULL, 
    `logins_number` int(11) NOT NULL, 
    `randkey` varchar(255) NOT NULL, 
    `is_active` int(5) NOT NULL, 
    PRIMARY KEY (`userid`), 
    KEY `username` (`username`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

, 내가 ocal_files의 defnition를 볼 수 있지만 수 없습니다

ocal_files.aiki_users = aiki_users.userid 

아무도 말할 수 쿼리가 얼마나 나쁜지, 반환되는 결과가 무엇입니까?

+0

귀하의 색인은 무엇입니까? – Efazati

+1

이 쿼리는 자연어로 무엇을하려합니까? 누군가 그것을 읽으면 2 줄짜리 질의를 쉽게 알아낼 수 없으며 실제로 상황은 나쁩니다. – Jon

+0

테이블 구조를 게시하는 데 도움이 될 것입니다. 적어도 쿼리에 관련된 열과 이들이 서로 어떻게 관련되어 있는지, 아마도 우리는이를 최적화하는 데 도움을 줄 수 있습니다. –

답변

4

당신은 중첩 된 쿼리의 곳은 전체 테이블 조인을 중지하지 않을 조인 절을 지정하지 않고, 메인 쿼리 모두 aiki_user 및 ocal_files에서 선택하고 ...

+0

나는 똑같은 해결책을 줄 예정이었다. +1 – dmcnelis

+0

+1 명시 적 조인 구문을 사용하지 않아서 부주의 한 데카르트 조인이 발생했습니다. –

+0

와우. 이제 알 겠어? 감사. 나는 이것을 제거하는 것을 잊는다. – jcubic

0

내가 좋겠 두 쿼리 모두에 대해 EXPLAIN PLAN을 실행하고 데이터베이스에서 알려주는 내용을 확인하는 것이 좋습니다.

내 생각 엔 당신이 테이블 스캔을해야한다는 것입니다, 그래서 성능은 끔찍한입니다.

+0

"EXPLAIN PLAN"및 "TABLE SCAN"이란 무엇입니까? – jcubic

관련 문제