큰 테이블에서 데이터를 가져 오기 위해 Python MySQLdb를 사용하여 매우 긴 실행 시간 (긴 페치 시간과 반대되는)이 있으며, 분명히 잘못된 것이 있는지 이해하고 싶습니다.Python MySQLdb가 느리게 실행됩니다.
이create table mytable(
a varchar(3),
b bigint,
c int,
d int,
e datetime,
f varchar(20),
g varchar(10),
primary key(a, b, c, d))
ENGINE=InnoDB;
그것은 현재 1 억 5000 만 행을 포함하고 테이블 크기 추정 19기가바이트입니다 :
내 테이블은 다음과 같이 정의된다. execute
명령에 소요되는 시간에서 오는
import MySQLdb
database = MySQLdb.connect(passwd="x", host="dbserver", user="user", db="database", port=9999)
mysql_query = """select a, b, c, d, e, f, g from mytable use index (primary) where a = %s order by a, b, c, d"""
mysql_cursor = database.cursor()
mysql_cursor.execute(mysql_query, ["AA"])
for a, b, c, d, e, f, g in mysql_cursor:
#Do something
내 놀라움을 다음과 같이
파이썬 코드입니다. 비록 내가 execute
이 (거의 기본 키를 사용하여 테이블을 통과해야하므로) 거의 시간을 소비하지 않고, for
루프에서 보낸 꽤 오랜 시간을 보냈지 만 litteraly는 여기에 오래 머무른다.
설명 할 계획은 다음과 같습니다
순간explain select a, b, c, d, e, f, g from mytable use index (primary) where a = %s order by a, b, c, d
'1','SIMPLE','eventindex','ref','PRIMARY','PRIMARY','5','const','87402369','Using where'
는, 모든 행이 (나중에 다른 값을 추가 할 생각했던 열에서 같은 값을 포함하지만, 순간 열 분포에서 콘텐츠가 실제로 균형을 이루지는 않음). 열 b가 더 잘 분산 됨
MySQL이 쿼리를 실행하는 데 너무 많은 시간을 소비하고 있다고 설명 할 수 있습니다 (행을 가져 오는 데 시간을 소비하는 것과 반대).
보너스 이 유스 케이스를 최적화하기위한 명백한 빠른 승리? B 열에 테이블 분할? 열? 열을 제거하고 별도의 테이블을 대신 사용 하시겠습니까?