2011-12-05 3 views
2

저속 쿼리 로그에서 자르기를 계속하는 매우 간단한 쿼리가 있습니다. 때 그것은 일반적으로 쿼리에 약 3-6 초 걸렸다 고 말합니다. 다음은 쿼리입니다.간단한 mysql 쿼리 속도를 향상시키는 방법

UPDATE company_users 
SET isonline=1, last_logon='2011-12-05 19:37:11', last_message=-1, 
    last_signal=-1, location=-1 
WHERE userid='3546600442XXXXX'; 

업데이트시 사용자 정보를 사용해야하므로이 업데이트를 사용해야합니다.

데이터베이스 구조는 다음

company_users 0 PRIMARY 1 개 ID 197 \ N \ N BTREE
company_users 1 indx_userid 1 아이디 197 \ N :

Field Type Null Key Default Extra 
id  int(11) NO PRI \N auto_increment 
userid varchar(20) NO MUL  
version varchar(3) YES  37 
owneruserid int(11) NO MUL 0 
simcard_phonenumber varchar(20) YES  \N 
registration_date date YES  \N 
labelname varchar(20) YES  \N 
isonline smallint(6) YES  0 
last_logon datetime YES  \N 
last_message int(11) YES  0 
last_voltage int(11) YES  0 
last_reboot datetime YES  \N  
connect_mode int(11) YES  1 
scheduleid int(11) YES MUL -1 
location  int(11) YES MUL -1 
img    varchar(50) YES   

I는 다음 인덱스가 \ N BTREE
company_users 1 indx_location 1 명 위치 12 \ N \ N YES BTREE
company_users 1 indx_scheduleid 1 scheduleid 49 \ N \ N YES BTREE
company_us ers 1 indx_owneruserid 1 owneruserid A 197 \ N \ N BTREE

표에는 약 300 개의 행이 있습니다. 데이터베이스가 내 웹 사이트와 동일한 서버에 있습니다. 이러한 쿼리는 PHP 스크립트를 사용하여 실행됩니다.

내가 잘못하고있는 부분이나 내 구성을 조정할 수있는 부분에 대한 정보가 충분하기를 바랍니다.

업데이트 : 데니스 (Dennis)의 제안에 따라 느린 쿼리 로그를 다시 살펴본 후 시간 프레임에 대해 세 개의 명령문이 기록되었음을 알게되었습니다.

Query_time : 5 Lock_time : 0 Rows_sent : 0 Rows_examined : 0

Query_time : 5 Lock_time : 0 Rows_sent이 위에서 확인 된 업데이트 문의 동일한 유형이었다 그들 중 두 가지에 대한 정보했다 : Rows_examined 0 : 0

Query_time 4 Lock_time : 0 Rows_sent 1 Rows_examined는 1

이 마지막 동일한 테이블에 대해 선택되었다. 나는 (내가 업데이트에서 해당 작업을 수행하는 방법을 모르는 등)이 select 문에 분석했고, 그것을 보여 주었다 :

아이디 SELECT_TYPE 테이블 유형이 possible_keys 키있는 key_len 심판 행이 SIMPLE company_users의 CONST이 indx_imei 22 CONST 1

을 indx_imei Extra1
+2

300 개의 행이있는 테이블의 경우 쿼리가 인덱스 없이도 실행되어야합니다. 그러나'user_id'에 대한 색인은 앞으로 유용 할 것입니다 (이미 가지고 있습니다). – newtover

답변

2

인덱스를 많이 사용하면 select 문 속도가 빨라지지만 삽입, 업데이트 및 삭제 속도가 느려질 수 있습니다. 나의 첫 번째 제안은 인덱스를 제거하고 질의를 다시 실행하여 시간이 개선되는지 확인하는 것입니다.

+0

다른 테이블과이 테이블에서 사용하는 조인을 돕기 위해 인덱스가 있습니다. 내가 잘못 했니? 이 상황에서 사용하는 인덱스는 위치, 예약 ID 및 소유자 사용자 ID입니다. – dreza

+0

올바른지, 인덱스를 사용하면 테이블을 조인 할 때 속도가 향상됩니다. 그러나 행을 많이 업데이트/삽입/삭제할 계획이라면 색인 수를 최소한으로 제한 할 것입니다. 또한 귀하의 질문에 설명 계획을 포함시킬 수 있다면 많은 도움이 될 것이라고 믿습니다. EXPLAIN에 익숙하지 않은 경우에 대한 자세한 내용은 여기를 참조하십시오. http://dev.mysql.com/doc/refman/5.5/en/using-explain.html –

2

300 레코드의 플랫 테이블에서 레코드를 업데이트하는 문제는 인덱스와 관련이 없음을 제안합니다. 삽입 문이 다른 문으로 차단되고있는 것 같습니다. 특정 조건 하에서 만 느려지거나 느려지 는가? 그렇다면 차단이 가능성있는 후보로 여겨 질 것입니다. 정말로 더 많은 정보가 필요합니다. 해당 테이블에서 가능한 차단 옵션을 조사하여 해당 테이블에 있는지 확인하고, 트랜잭션 격리 수준 및 자동 커밋 구성과 같은 항목을 확인하기 전에 이러한 쿼리를 최적화 할 수 있는지 처음에 확인하십시오.

문제가 선택 쿼리 잠금 인 경우 잠금없이 select 쿼리를 실행하여 확인할 수 있습니다 (가능하면 문제를 해결할 수 있음). 이것은

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM TABLE_NAME ; -- Place your select query here 
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; 

에 의해 수행 될 수 있지만,이 접근법에는 몇 가지 건강 경고가 있습니다. 무엇이 잘못되었는지에 대한 더 많은 정보를 얻고이 접근법을 사용하는 것보다 가능한 한 최적으로 가깝게 만들어 문제의 원인을 해결하는 것이 더 좋습니다.

나는이 Coding Horror blog을 유용한 통찰력으로 기억합니다.

+0

감사합니다. 그것은 아마도 그런 것처럼 보일 것입니다. 그러나 그것들은 느린 쿼리 로그에도 나타나지 않을까요? 가능성있는 범인처럼 들리는 차단 선택을 식별하기 위해 할 수있는 기술이나 일이 있습니까 – dreza

1

저는 AlexC와 다른 진술이 UPDATE 문을 막고있을 가능성이 높습니다. 업데이트가 차단되지 않았는지 확인하려면 두 개의 데이터베이스로 작업 할 수 있습니다. 마스터 db에서 UPDATES 및 INSERTS를 수행하고 첫 번째에서 복제 된 두 번째는 모든 SELECT가 일어나는 곳입니다.

또는 실제로 어떤 문이 실제로 쿼리를 차단하고 있는지 확인하고 쿼리를 최적화 할 수 있습니다. 집중적으로 선택된 데이터베이스에서는 쉽게 달성되지 않을 수 있습니다.

+0

감사합니다. Sascha. 두 데이터베이스가 현재 계획 인 경우 확실하지 않지만 미래에 조사해야 할 부분 일 수도 있습니다. – dreza

+0

프로덕션 환경은 어떻게 보이지만 다른 날씨로 인해 업데이트가 차단되는지 날씨를 테스트 할 수있는 방법은 확실하지 않습니다. 업데이트 (ofc :)를 수행하는 동안 다른 쿼리가 실행되지 않도록하십시오. 데이터베이스가 살아 있지 않다면 나는 단지 업데이트 쿼리가 실행되고 날씨가 여전히 느린지 확인해야한다. –

관련 문제