2013-07-07 6 views
2

저는 최근 모든 것을 무결성을 유지하기 위해 다양한 mysql 테이블에 많은 트리거를 추가했습니다. 간단한 업데이트가 이제는 매우 오래 걸리기 때문에 내가 엔진을 죽였을지도 모른다고 걱정됩니다.InnoDB 엔진 단순 업데이트 쿼리가 지나치게 길어졌습니다 (query_end)

고려 :

UPDATE `partner_stats` SET earnings=1 WHERE date=CURRENT_DATE() 
0 rows affected. (Query took 0.6523 sec) 

SELECT * FROM `partner_stats` WHERE date = CURRENT_DATE() 
1 total, Query took 0.0004 sec 

SELECT은 0.0004 필요하지만 간단한 UPDATE은 0.65 걸립니다!

이 특정 표 에는 단 하나의 행이 있으며과 연관된 트리거가 없습니다. 엔진을 MyISAM으로 전환하면 문제가 해결되지만 나중에이 테이블에 대한 트리거를 추가해야 InnoDB를 고수 할 수 있습니다.

내 엔진에 문제가 있습니까? 다른 테이블과 작업하기에는 너무 바쁩니 까? 프로파일 링 또는 디버깅 옵션에는 어떤 것이 있습니까?

편집 : 프로파일 링을했고 그것을이 보여줍니다

mysql> show profile for QUERY 2; 
+----------------------+----------+ 
| Status    | Duration | 
+----------------------+----------+ 
| starting    | 0.000064 | 
| checking permissions | 0.000008 | 
| Opening tables  | 0.000032 | 
| System lock   | 0.000007 | 
| init     | 0.000051 | 
| Updating    | 0.000069 | 
| end     | 0.011682 | 
| query end   | 0.218070 | 
| closing tables  | 0.000016 | 
| freeing items  | 0.000017 | 
| logging slow query | 0.000003 | 
| cleaning up   | 0.000002 | 
+----------------------+----------+ 
12 rows in set (0.00 sec) 
+0

가장 긴 시간을 차지하는 두 섹션은 끝이 분명하고 쿼리가 끝납니다. 이것들은 모두 binlog에 쓰는 것과 관련이 있습니다. 몇 가지 유용한 답변이있는 또 다른 질문이 있습니다. http://stackoverflow.com/questions/13234290/lots-of-query-end-states-in-mysql-all-connections-used-in-a-matter-of -의사록. 대답 중 하나는 "sync_binlog 변수를 1에서 0으로 변경했기 때문에 각 커밋에서 binlog 변경 사항을 디스크로 플러시하는 대신 운영 체제에서 binlog에 대한 fsync() 시점을 결정할 수 있습니다. "질의 종료"문제. " –

답변

1

당신은 here 설명처럼 InnoDB의 엔진을 최적화하기 위해 시도해야합니다. 어떤 복제 프로덕션 서버에서 사용할 수 :

innodb_flush_log_at_trx_commit = 2

# 1의 값은 ACID 준수가 필요합니다. 값을 1과 다른 값으로 설정하면 성능을 향상시킬 수 있지만 충돌이 발생하면 최대 1 초의 트랜잭션을 잃을 수 있습니다.

innodb_buffer_pool_size = [총 메모리의 75 %]

innodb_log_file_size = innodb_buffer_pool_size 25 %]

innodb_log_buffer_size = innodb_log_file_size 10 %]의 CPU

에서 innodb_thread_concurrency = 2 X 번호) + 디스크 수 또는 자동 감지시 0입니다.