2012-01-17 5 views
3

MySQL에 액세스하려면 mysql.connector (MySQLdb Python 구현?)를 사용합니다. 커서에서 select 문을 전송하는 것이 그렇게 빠르지는 않습니다.빠른 파이썬 MySQL

코드 속도를 높이는 방법이 있습니까?

다른 라이브러리일까요? 어느? (나는 Windows와 Python 3.1을 가지고있다) 커서를 반복하는 것과는 다른 행 검색을하는 것이 좋을까?

+1

왜 클라이언트 라이브러리가 아니라 쿼리가 느려지는 것 같습니까? 그 외에도 일부 코드를 보여주십시오. – ThiefMaster

+0

SQL 브라우저에서 동일한 쿼리를 실행하는 것이 훨씬 빠릅니다. 코드가 퍼지지 만 오래 걸리지 않습니다. SQL 액세스가 불가능하지만 파이썬 코드에 있다면, 직접 해보도록하겠습니다. 여기는 질문이 아닙니다. – Gerenuk

답변

10

기본값 MySQLdb 커서는 서버에서 전체 쿼리 결과를 한 번에 가져옵니다. 이 데이터를 Python 튜플 목록으로 변환하면 많은 메모리와 시간을 소비 할 수 있습니다.

거대한 쿼리를 만들고 한 번에 하나씩 서버에서 결과를 가져 오려면 MySQLdb.cursors.SSCursor을 사용하십시오. 그러나 SSCursor를 사용할 때 connectionno other query can be made을 입력하면 전체 결과 집합을 가져올 때까지 유의하십시오.

import MySQLdb 
import MySQLdb.cursors as cursors 
connection = MySQLdb.connect(
    ... 
    cursorclass = cursors.SSCursor) 
cursor = connection.cursor() 
cursor.execute(query) 
for row in cursor: 
    ... 

또는 oursql, MySQL 용 대체 파이썬 드라이버를 사용하십시오. oursql의 기능 중 하나는 fetchs rows lazily입니다.

+0

감사! 흥미로운 팁 :) 나는이 가능성을 조사하려고 노력할 것이다. – Gerenuk

+0

executemany 팁은 매우 유용했습니다. 또한 fetchall이 커서 액세스보다 훨씬 빠르다는 것을 알았습니다! SSCursor는 아직 이해하지 못했지만, 염두에두고 있습니다 :) – Gerenuk

+0

@unutbu mysql이 서버 측 쿼리를 지원합니까? 나는 mysql이 즉시 레코드를 검색하면 레코드를 하나씩 보내 줄 것이라고 생각한다. 데이터를 캐시하지 않습니다. 그렇지 않으면, 누군가가 mysql 서버를 죽이려고한다면, 그냥 큰 테이블 SSCursor를 보내면, mysql 서버 메모리가 부족할 것입니다. –