2017-09-14 9 views
-2

PHP (Supervisor)에서 다중 프로세스 포킹. 각각은 동일한 Mysql DB에 대한 연결을 생성하고 동일한 SELECT 쿼리를 병렬로 실행합니다 (Gearman). 프로세스 (즉, 동일한 시간 연결)의 양을 늘리면 동일한 쿼리가 병렬로 실행되어 각 프로세스의 SHOW PROCESSLIST에서 데이터 시간이 늘어납니다. 트랜잭션 수준이 READ UNCOMMITED 인 단순 선택입니다. 그것은 몇 가지 MySQL의 설정 문제가 있습니까? 또는 SELECT 쿼리가 테이블 잠금을 발생 시켰습니까? 또는 전체 스캔이 수행합니까?mysql에 대한 연결 수가 증가하면 동일한 쿼리에서 각각 데이터 시간이 증가합니다.

서버 : 우분투 16.04.2 LTS. 1 CPU 코어. MySQL 5.7.17. innodb_buffer_pool_size 12기가바이트

+2

네트워크 대기 시간, 테이블 구조, 인덱스 및 쿼리 효율성에 관한 정보 일 수 있습니다. 따라서 스키마와 쿼리에 대한 자세한 내용을 제공해야합니다. – abeyaz

+0

하나의 연결에서 3 초 동안 실행되는 자체 조인 (13 개의 고유 테이블)을 포함하여 32 개의 테이블을 사용하지만, 두 개의 병렬 프로세스에서 각 프로세스에서 6 초가 소요됩니다. 쿼리는 많은 조인으로는 충분하지만 집계 및 정렬은 없습니다. 하나의 테이블 스캔 4262 rows with using_where 및 45 % 필터링, 다른 인덱스 사용 –

+0

각 쿼리에서 테이블을 잠그고있는 것처럼 보입니다. BEGIN TRANSACTION을 사용하고 있습니까? – abeyaz

답변

0

그것은 상세한 설명을 하나 개의 연결

꼭 3 초 실행 자기 결합 (13 고유 테이블)을 포함하여 32 개 개의 테이블을 사용한다. 누락되거나 부적합한 색인처럼 들립니다. ?.

이가 "엔티티 - 속성 - 값이 그렇다면, 여기 끝 따랐다이다. http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

InnoDB의 테이블을 잠그지 않습니다하지만 모든 행을 잠글 것입니다 테이블 스캔을 수행 할 수 있습니다 다시 소리 백그라운드에서 계속 쓰기의 어떤 종류가있는 경우 잘못된 인덱스 및/또는 검색 식처럼.

모든 13 개 테이블 SHOW CREATE TABLE 플러스 SELECTEXPLAIN SELECT ...을 제공하십시오.

, 그것은 심지어는 SELECT에 영향을 미칠 수에모드.

최소 16GB RAM?

얼마나 많은 프로세스를 포크로? 몇 개의 CPU 코어가 있습니까?

+0

1 CPU 코어, 15GB RAM. 심지어 2 프로세스가 각각 두 번씩 시간을 늘립니다. 전체 DB에는 삽입/업데이트 작업이 없습니다. 그리고 네, 나쁜 쿼리를하는 것 같습니다. 그러나 그것을 잘 최적화 할 수는 없으므로 API로 구현해야합니다. 수평 적 샤딩이 도움이 될 수 있습니까? –

+0

아마도 CPU가 실행 중일 때 CPU가 100 %입니까? 그것은 3을 설명 할 것입니다; 생성 된 쿼리를 변경할 수 없으면 샤딩을 구현할 수 없습니다. 쿼리를 봅시다. –