2014-04-02 3 views
1

지난 며칠 동안 임의의 시간에 내 웹 사이트가 매우 느리게되었습니다. 내가 할 수있는 최선의 것을 조사하기 시작했다. MySQL 프로세스가 내 서버의 사용 가능한 메모리의 85-95 %를 사용하고있는 것을 보았습니다 (메모리를 업그레이드해야합니까?). MySQL 테이블에서 테이블 수준 잠금 대기

나는 나의 MySQL의 프로세스 로그를 확인, 나는 거대한와 쿼리의 목록을 발견 : 테이블 레벨 잠금

대기

그러나 나는 또한주의를, 무엇 이러한 쿼리의 모든 "테이블 수준 잠금"을 사용하는 쿼리는 users이라는 테이블과 관련이 있습니다.

나는 상수 쿼리와 함께 20 개의 다른 테이블이 있지만 목록에 표시되지 않습니다. 그래서 문제가 users 테이블에 있다고 생각하십니까?

나는 어떻게 테이블을 향상시킬 수 있는지 궁금해하고 결국 테이블 레벨 잠금을 제거합니까?

SHOW VARIABLES LIKE 'query_cache%'; 

이 결과 어떤 :

query_cache_limit 
1048576 
query_cache_min_res_unit 
4096 
query_cache_size 
33554432 
query_cache_type 
ON 
query_cache_wlock_invalidate 
OFF 

날 내 데이터베이스/MySQL을 개선하기 위해 무엇을 할 수 있는지 알려 주시기 바랍니다

나는이 달렸다.

| 228 | db_user | localhost | db_db| Query   | 5 | Waiting for table level lock | SELECT count(*) FROM users WHERE createtime>'1396411200' OR createtime='1396411200'     | 
    | 229 | db_user | localhost | db_db| Query   | 4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use | 
| 203 | db_user | localhost | db_db| Query   | 6 | Waiting for table level lock | SELECT SUM(cashedout) FROM users                  | 
| 204 | db_user | localhost | db_db| Query   | 4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use | 
| 205 | db_user | localhost | db_db| Query   | 1 | Waiting for table level lock | SELECT * FROM users WHERE id='12055'                 | 
| 206 | db_user | localhost | db_db| Query   | 2 | Waiting for table level lock | SELECT * FROM users WHERE id='22530'                 
| 197 | db_user | localhost | db_db| Query   | 3 | Waiting for table level lock | SELECT * FROM `users` WHERE `username` = 'ptc4life123' LIMIT 1          | 
| 200 | db_user | localhost | db_db| Query   | 3 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0050' WHERE use | 

이것은 기본적으로 모든 잠금 프로세스가 모습입니다 :

는 프로세스의 목록입니다.

+0

사용자에게 색인을 추가하기 시작합니다. 특히 사용자 성, dept, ID ...와 같은 필드는 검색어에 자주 사용됩니다. – smoore4

+0

인덱스? 약간 정교한 배려? (죄송 합니다만, MySQL에 대해 아직 처음입니다.) – oliverbj

답변

2

이 명령을 실행

show processlist; 

이 인덱스를 추가하는 측면에서 찾는 당신에게 실행중인 실제 SQL 명령 및 장소를 표시합니다. 가능하다면 가장 오랫동안 실행중인 SQL을 게시하십시오.

인덱스를 추가하면 다음과 같이 표시됩니다

ALTER TABLE MYTABLE ADD INDEX idx_columnname (COLUMN_NAME ASC) ; 

그러나 당신이하지 않도록주의 할 생산 기간 동안 그. 언뜻보기에 사용자 테이블의 ID 및 사용자 이름 열에서이 작업을 수행하려고합니다.

+0

내 업데이트 된 질문을 참조하십시오. 느린 프로세스 목록을 포함 시켰습니다. – oliverbj

+0

좋아요. 그리고 당신이 그것을 실행할 때이 번호는 무엇입니까? 선택 카운트 (*) 사용자로부터 – smoore4

+0

그것은 "24096"을 반환합니다 – oliverbj

0

테이블의 저장소 엔진을 확인합니다. 행 수준 잠금 만 가능하도록 가능한 한 Innodb로 변경하십시오. 색인을 사용하지 않는 경우 innodb 테이블 을 사용하는 경우에도 실행중인 쿼리가 테이블 잠금을 강제 할 수 있습니다. 느린 기간 일 동안

+0

"색인"에 대해 조금 더 설명해 주시겠습니까? 어떻게 사용해야합니까? – oliverbj

+0

인덱스는 데이터에 대한 포인터입니다. 리프 노드로 전체 행을 갖는 이진 트리 (가장 일반적으로)입니다. 예를 들어 기본 키는 단일 행을 가리키는 색인입니다. 차이점은 데이터를 가져 오기 위해 전체 테이블 스캔을 수행하지 않아도되도록 정렬 될 것입니다. – Gooner

+0

색인을 생성하지 않으면 색인 스캔 대신 전체 테이블 스캔을 수행 할 때 전체 테이블이 잠겨있는 것처럼 작동합니다. – Gooner