EC2 Micro实例上的MySQL性能不佳

时间:2013-09-29 21:31:45

标签: python mysql ubuntu amazon-ec2 sqlalchemy

我有一个小的webapp,它使用Pyhon / Flask和MySQL数据库来存储数据。我有一个studentdatabase,有大约3千行。在尝试加载该页面时,加载需要很长时间,有时甚至一分钟左右。它大约20秒,这真的很慢,我想知道是什么导致了这一点。 This是发出任何请求之前服务器的状态,当我尝试加载该网站时会发生this

正如我所说,这不是太多的记录,我很困惑为什么这是如此无效。我正在使用带有Ver 14.14 Distrib 5.5.32, for debian-linux-gnu (x86_64) using readline 6.2 mysql版本的Ubuntu 12.04。其他查询运行正常,例如列出名称以某个字母开头的学生大约需要2-3秒,这是可以接受的。这显示了表格的一部分,所以我猜测某些东西没有正确优化。

My.cnf文件为located here。我尝试了一些东西,在底部添加了一些线条,但没有太大的成功。

实际查询由sqlalchemy完成,这是用于加载它的特定代码:

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())

这似乎是生成的SQL:

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"

提前感谢您的时间和帮助!

2 个答案:

答案 0 :(得分:2)

微型实例的性能相当慢。它们采用可突发的CPU配置文件设计,并且在超出突发时间时会受到严格限制。

那就是说,你的问题可能出在数据库设计上。每当您想要连接两个表时,您希望在连接的右侧和左侧的列上具有索引。在这种情况下,您使用的是电子邮件字段。

使用字符串连接不如使用整数id那么理想。使用Explain关键字将直接在mysql中运行查询将向您显示执行计划,并可以帮助您快速确定您可能缺少索引的位置或有其他问题。

答案 1 :(得分:2)

@datasage是对的 - 微实例只能这么做。您可以尝试为您的mysql数据库启动第二个微实例。在单个微实例上运行apache和mysql将会很慢。

根据我的经验,当使用AWS的RDS服务(mysql)时 - 您可以在微实例上获得合理的性能以进行测试。根据实例的持续时间,有时您可以让爬虫程序ping您的站点,因此可以在安全策略中将IP限制到您的计算机。

您的数据库结构看起来并不复杂 - 您可能会在电子邮件字段中添加索引,但我怀疑除非您的数据集超过5000行,否则它不会产生太大影响。如果您使用的是sqlalchemy ORM,则会显示如下:

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