2013-09-29 69 views
1

我有一個小型webapp,它使用Pyhon/Flask和MySQL數據庫來存儲數據。我有一個學生數據庫,大約有3千行。嘗試加載該頁面時,加載需要很長時間,有時甚至需要一分鐘左右。大約20秒,這真的很慢,我想知道是什麼造成這種情況。 This是在發出任何請求之前服務器的狀態,當我嘗試加載該網站時發生this在EC2 Micro實例上的MySQL性能不佳

正如我所說的,這是沒有太多的記錄,我感到這是爲什麼無效不解。我正在使用Ubuntu 12.04,與Ver 14.14 Distrib 5.5.32, for debian-linux-gnu (x86_64) using readline 6.2 mysql版本。其他查詢運行良好,例如列出名稱以某個字母開頭的學生大約需要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" 

預先感謝您時間和幫助!

+0

你在桌子上有什麼索引?你能得到由sqlalchemy生成的實際查詢嗎? – datasage

+0

沒有索引,我對數據庫的使用相對比較陌生,並沒有使用它們。在問題中添加了由鍊金術生成的查詢。 –

回答

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) 
+0

嘿,我明白了。我可能會嘗試下一個實例類型來看看這是怎麼回事。 至於索引,heidisql顯示我這一個表:http://pokit.org/get/img/afa195715379ef93cd1695520a9652c2.jpg 我已經有了。 id = db.Column(db.Integer(11),primary_key = True,autoincrement = True) email = db.Column(db.VARCHAR(60),unique = True) 這是否算作索引或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

微實例性能相當慢。它們的設計具有可突發的CPU配置文件,並且在突發時間超出時將受到嚴格限制。

也就是說,這裏的問題可能與您的數據庫設計有關。無論何時想要連接兩個表,您都希望在連接的右側和左側具有索引。在這種情況下,您正在使用電子郵件字段。

使用字符串加入並不像使用整數ID那樣最佳。同樣使用Explain關鍵字將直接在mysql中運行查詢將顯示一個執行計劃,並可以幫助您快速確定可能缺少索引或有其他問題的位置。

+0

正如我在以前的現場說,我把這些電子郵件領域獨一無二的,當我去到結構在phpMyAdmin/heidisql我得到那些兩列索引:http://pokit.org/get/img/cd44443e715eb50d8630dc0092c89ce4 。jpg –

+0

感謝您的意見,正如我在其他評論中所說的,我會考慮升級實例類型。 –