2013-09-29 1 views
1

데이터 저장을 위해 Pyhon/Flask와 MySQL 데이터베이스를 사용하는 하나의 작은 webapp가 있습니다. 나는 약 3000 개의 줄이있는 studentsdatabase를 가지고있다. 해당 페이지를로드하려고하면로드하는 데 많은 시간이 걸리고 때로는 1 분 정도 걸립니다. 그것의 약 20 초, 정말 천천히 그리고 나는 이것이 무엇을 일으키는 지 궁금해하고 있습니다. This은 요청이 이루어지기 전의 서버 상태이고 해당 사이트를로드하려고하면 this이 발생합니다.EC2 Micro 인스턴스의 MySQL 성능이 좋지 않음

내가 말했듯이 이것은 너무 많은 레코드가 아니며, 왜 이것이 비효율적인지에 의아해합니다. 나는 Ver 14.14 Distrib 5.5.32, for debian-linux-gnu (x86_64) using readline 6.2 mysql 버전으로 우분투 12.04를 사용하고있다. 다른 쿼리는 잘 실행됩니다. 예를 들어 이름이 문자로 시작하는 목록 학생은 2-3 초 정도 걸릴 수 있습니다. 그것은 테이블의 일부분을 보여 주므로 뭔가가 올바르게 최적화되지 않았다고 생각합니다.

My.cnf 파일은 located here입니다. 나는 약간의 물건을 시험해 보았고, 바닥에 몇 줄을 추가했지만 너무 많은 성공을 거두지 않았다.

실제 쿼리

은 SQLAlchemy의 수행, 이것은이를로드하는 데 사용되는 특정 코드된다 : 이것은 SQL을 생성 할 것으로 보인다

score = db.session.query(Scores.id).order_by(Scores.date.desc()).correlate(Students).filter(Students.email == Scores.email).limit(1) 
students = db.session.query(Students, score.as_scalar()).filter_by(archive=0).order_by(Students.exam_date) 
return render_template("students.html", students=students.all()) 

:

SELECT student.id AS student_id, student.first_name AS student_first_name, student.middle_name AS student_middle_name, student.last_name AS student_last_name, student.email AS student_email, student.password AS student_password, student.address1 AS student_address1, student.address2 AS student_address2, student.city AS student_city, student.state AS student_state, student.zip AS student_zip, student.country AS student_country, student.phone AS student_phone, student.cell_phone AS student_cell_phone, student.active AS student_active, student.archive AS student_archive, student.imported AS student_imported, student.security_pin AS student_security_pin, (SELECT scores.id \nFROM scores \nWHERE student.email = scores.email ORDER BY scores.date DESC \n LIMIT 1) AS anon_1 \nFROM student \nWHERE student.archive = 0" 

감사를 사전에 대한 시간과 도움!

+0

테이블에 어떤 색인이 있습니까? sqlalchemy에 의해 생성 된 실제 쿼리를 얻을 수 있습니까? – datasage

+0

인덱스가 없기 때문에 데이터베이스 작업에 비교적 익숙하지 않으며이를 사용하지 않았습니다. 알케미가 생성 한 쿼리를 질문에 추가했습니다. –

답변

2

@ 데이터 타지가 적합합니다. 마이크로 인스턴스는 그저 그렇게 많이 할 수 있습니다. mysql 데이터베이스를위한 두 번째 마이크로 인스턴스를 시작할 수도있다. 단일 마이크로 인스턴스에서 apache와 mysql을 모두 실행하면 속도가 느려집니다.

내 경험에 비추어 볼 때 AWS의 RDS 서비스 (mysql)를 사용할 때 테스트를 위해 마이크로 인스턴스에서 적절한 성능을 얻을 수 있습니다. 인스턴스가 얼마나 오래되었는지에 따라 사이트를 핑하는 크롤러를 얻을 수 있으므로 보안 정책에서 IP를 컴퓨터로 제한 할 수 있습니다.

데이터베이스 구조가 복잡해 보이지 않습니다. 이메일 필드에 색인을 추가 할 수는 있지만, 데이터 세트가 5000 행을 넘지 않으면 큰 차이가 없습니다. sqlalchemy ORM을 사용하는 경우 다음과 같이 표시됩니다.

class Scores(base): 
    __tablename__ = 'center_master' 
    id = Column(Integer(), primary_key=True) 
    email = Column(String(255), index=True) 
+0

안녕하세요, 이해합니다. 다음 인스턴스 유형을 시도해 볼 수 있습니다. 인덱스의 경우 heidisql은 하나의 테이블에 대해 다음과 같이 표시합니다. http://pokit.org/get/img/afa195715379ef93cd1695520a9652c2.jpg 이미 알고 있습니다. ID = db.Column (db.Integer (11), primary_key와 = 사실, 자동 증가 = 참) 이메일 = db.Column (db.VARCHAR (60), 진정한 = 고유) 은 인덱스 또는 I로이 수를합니까 구체적으로 "index = True"부분을 추가해야합니까? –

+1

Unique는 mysql에서 인덱스로 처리되므로 index = True를 추가 할 필요가 없습니다. 그 이유는 http://stackoverflow.com/questions/3127765/mysql-does-a-unique-column-field-imply-an-index-and-if-so-why를 참조하십시오. –

+0

시간 내 주셔서 감사 드리며, EC2에 대한 계획을 업그레이드하는 것을 고려해 보겠습니다. –

2

마이크로 인스턴스의 성능이 현저히 떨어집니다. 버스트 블 (burstable) CPU 프로파일로 설계되었으며 버스트 가능 시간을 초과하면 크게 제한됩니다.

귀하의 문제는 귀하의 데이터베이스 설계 가능성이 있습니다. 두 테이블을 조인 할 때마다 조인의 오른쪽과 왼쪽 컬럼에 인덱스가 있어야합니다. 이 경우 전자 메일 필드를 사용하고 있습니다.

문자열을 사용하여 가입하면 정수 ID를 사용하는 것만큼이나 최적이 아닙니다. 또한 Explain 키워드를 사용하면 mysql에서 직접 쿼리를 실행하여 실행 계획을 보여 주며 누락 된 인덱스가 있는지 또는 다른 문제가 있는지 신속하게 파악할 수 있습니다.

+0

이전 필드에서 말했듯이 필자는 전자 메일 필드를 고유 한 것으로 지정하고 phpmyadmin/heidisql의 구조로 이동하면 해당 두 열이 인덱싱됩니다. http://pokit.org/get/img/cd44443e715eb50d8630dc0092c89ce4 .jpg –

+0

의견을 보내 주셔서 감사합니다. 다른 의견에서 말씀 드렸듯이 인스턴스 유형을 업그레이드하는 것을 고려해 보겠습니다. –