[英]How do I routinely kill MySQL queries that have been alive for “too long”?
[英]Why do these queries kill MySQL performance? How can I fix them?
我創建了一個緩慢的查詢日志,以找出導致網站負載的服務器CPU使用率激增的原因。 我找到了這些查詢。
SELECT * FROM games WHERE game_over = 0 ORDER BY id DESC LIMIT 100;
# User@Host: root[root] @ localhost [127.0.0.1]
# Thread_id: 2545188 Schema: qe QC_hit: No
# Query_time: 0.162958 Lock_time: 0.000030 Rows_sent: 1 Rows_examined: 218089
由於我們有一個游說系統,可以通過運行此查詢來刷新其中的許多信息,因此許多信息會彈出。 這可以輕松地每分鍾運行200次以上,我感覺這會導致您在其他文章中可能看到的瘋狂的CPU使用率。 (在負載下為8核時為400%+)。 這是另一個經常在日志中彈出的示例。
SELECT * FROM deposits WHERE game_id = '109067' AND user_id = '19153';
# User@Host: root[root] @ localhost [127.0.0.1]
# Thread_id: 2545260 Schema: qe QC_hit: No
# Query_time: 0.261047 Lock_time: 0.000038 Rows_sent: 1 Rows_examined: 218091
我知道考慮已檢查/已發送的行數存在嚴重問題,但是我對此不知所措。 我已經在一個星期的時間內根據調諧器對my.cnf進行了調整。 游戲表大約有12萬行,存款表大約有25萬行。
最后,我知道我的服務器無法擴展,那么如何解決這些查詢和其他查詢以在負載下表現良好?
如果您不向我們展示games
和deposits
的模式,我們不會知道多少,但是如果您沒有games
game_over
的索引(或者更好的是,該順序中game_over
和id DESC
的復合索引),以及deposits
game_id
索引(甚至更好的是game_id
和user_id
的復合索引),那么這就是問題的開始。
而不是使用
Select * from.....
我建議使用表格中要求的特定字段
:
Select id,name,......
您需要索引,但是您還需要正確地表達您的查詢。
對於此查詢:
SELECT *
FROM games
WHERE game_over = 0
ORDER BY id DESC
LIMIT 100;
最佳索引位於games(game_over, id desc)
。 這同時滿足where
子句和order by
的order by
。 那也行。
對於此查詢:
SELECT *
FROM deposits
WHERE game_id = '109067' AND user_id = '19153';
最佳索引是在deposits(game_id, user_id)
(列可以按任意順序排列)。 但是請注意。 如果id字段是數字字段,請刪除引號:
SELECT *
FROM deposits
WHERE game_id = 109067 AND user_id = 19153;
在比較中使用錯誤的類型可能會導致索引未使用。 (我認為您的特定示例還可以,但這仍然是一個壞習慣。)
明確列出這些列不太可能提高性能。 但是,這是一個好主意,因為如果表發生更改,它會使代碼更健壯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.