我的應用程序的一部分存在一個大問題。我使用的是SQLAlchemy和MySQL的組合,並且大部分的工作都很好,但是有一個癢會持續加載,有時甚至5-6分鐘,載入客戶列表。該表大約有3000行,這對於數據庫標準來說應該是相當小的,並且我在一個稍大的表格(25k行)上有一個簡單的連接。MySQL性能不佳
在SQL鍊金術查詢如下:
last_inv = db.session.query(Sales.id).order_by(Sales.invoice_date.desc()).filter(Customer.email == Sales.email).limit(1).correlate(Customer)
results = db.session.query(Customer, last_inv.as_scalar()).filter_by(archive=0)
原始SQL看起來是這樣的:
SELECT customer.id AS customer_id
, customer.first_name AS customer_first_name
, customer.middle_name AS customer_middle_name
, customer.last_name AS customer_last_name
, customer.email AS customer_email
, customer.password AS customer_password
, customer.address1 AS customer_address1
, customer.address2 AS customer_address2
, customer.city AS customer_city
, customer.state AS customer_state
, customer.zip AS customer_zip
, customer.country AS customer_country
, customer.phone AS customer_phone
, customer.cell_phone AS customer_cell_phone
, customer.current_plan AS customer_current_plan
, customer.minutes_current_plan AS customer_minutes_current_plan
, customer.orig_sales_id AS customer_orig_sales_id
, customer.sales_id AS customer_sales_id
, customer.team_id AS customer_team_id
, customer.refill_date AS customer_refill_date
, customer.minutes_refill_date AS customer_minutes_refill_date
, customer.active AS customer_active
, customer.archive AS customer_archive
, customer.imported AS customer_imported
, customer.ipaddress AS customer_ipaddress
, customer.auto_renewal AS customer_auto_renewal
, customer.signup_date AS customer_signup_date
, customer.esn AS customer_esn
, customer.last_update_date AS customer_last_update_date
, customer.last_update_by AS customer_last_update_by
, customer.notes AS customer_notes
, customer.current_pin AS customer_current_pin
, customer.minutes_current_pin AS customer_minutes_current_pin
, customer.security_pin AS customer_security_pin
, (SELECT sales.id
FROM sales
WHERE customer.email = sales.email
ORDER
BY sales.invoice_date DESC LIMIT 1) AS anon_1
FROM customer
WHERE customer.team_id = 1
AND customer.archive = 0
我已經試過無數的事情,但這是真的開始讓我感到絕望。這一切都在亞馬遜上運行,並且htop
在運行時顯示100%的MySQL使用率。 Profiler對phpmyadmin進行查詢時,HeidiSQL顯示它在不到兩秒的時間內完成(當不在cahce中查找時),所以它不是實際的查詢造成的(正如我理解的那樣)。
這是EXPLAIN
顯示:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY customer ALL NULL NULL NULL NULL 3621 Using where
2 DEPENDENT SUBQUERY sales ALL NULL NULL NULL NULL 22619 Using where; Using filesort
我在EC2上運行一個m1.small實例,內存爲1650MB。
我也運行了一個mysqlprofiler,以下是結果before和after我所做的優化。我的my.cnf
文件是here。
我已經嘗試在表上運行OPTIMIZE
,但由於某種原因未優化的表的數量總是98,所以我想我做錯了什麼。我使用this腳本,以及phpmyadmin中的原始sql,但沒有成功。
任何幫助表示讚賞,謝謝閱讀!
相關的子查詢往往表現不佳 – Strawberry
你有'customer.email'和'sales.email'上的索引嗎? – datasage
我現在就做!第二個,sales.email沒有索引,完全忘了。哇現在顯着更快,謝謝一堆! :) –