2011-03-24 2 views
3

성능이 좋지 않은 쿼리가 있습니다. 서버 버전 : 5.1.37-1ubuntu5.1 (Ubuntu)mysql 5.1.37 쿼리 인덱스가 사용되지 않습니다.

SELECT * FROM `influencers` WHERE (`influencers`.`twitter_id` = 86861293) LIMIT 1 

show create table influencers 

influencers CREATE TABLE `influencers` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`twitter_id` varchar(255) DEFAULT NULL, 
`display_name` varchar(255) DEFAULT NULL, 
`created_at` datetime DEFAULT NULL, 
`updated_at` datetime DEFAULT NULL, 
`screen_name` varchar(255) DEFAULT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `index_influencers_on_twitter_id` (`twitter_id`), 
KEY `influencers_screen_name` (`screen_name`) 
) ENGINE=InnoDB AUTO_INCREMENT=504126 DEFAULT CHARSET=latin1 


explain SELECT * FROM `influencers` WHERE (`influencers`.`twitter_id` = 86861293) LIMIT 1 


id select_type table  type possible_keys     key  key_len ref  rows Extra   
-- ----------- ----------- ---- ------------------------------- ------ ------- ------ ------ ----------- 
1 SIMPLE  influencers ALL index_influencers_on_twitter_id (null) (null) (null) 553716 Using where 

테이블의 행 수가 547545 개입니다.

설명에서 볼 수 있듯이 explain에는 가능한 키가 있지만 실제 키를 사용하여 표시하지는 않습니다.

아이디어가 있으십니까? 이게 효과가 있고, 뭔가 바보 같은 짓을하는 것 같아. twitter_id은 VARCHAR 때문에

+0

당신은 SELECT * FROM 시도 할 수 있습니다 'influencers' WHERE ('influencers'.wtwitter_id' = "86861293") LIMIT 1 – Zimbabao

+0

그 것이 오타입니까, 아니면 실제로 여러분의 EXPLAIN에서'twitter_id'를 사용하고 계십니까? – nos

답변

1

, 당신은 최적의 실행 계획을 사용하는 MySQL을 방지 할 수있는 암시 적 타입 변환을 피하기 위해 WHERE 절에 인용 부호의 값을 넣어해야합니다

SELECT * 
FROM influencers 
WHERE influencers.twitter_id = '86861293' 
LIMIT 1 
+1

그걸 고쳐 주셔서 고마워, 내가 레일에 int를 전달하는 것 같아요. 왜 그런 식으로 그렇게했는지, 조금 연구해야하지만, 문제가있는 것 같습니다. bigint로 변경할 수 있습니다. – Joelio

+0

모든 값이 bigint 인 경우 varchar가 아닌 bigint로 열 유형을 변경하는 것이 좋습니다. –

관련 문제