簡體   English   中英

為什么這些查詢會破壞MySQL的性能? 我該如何解決?

[英]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萬行。

最后,我知道我的服務器無法擴展,那么如何解決這些查詢和其他查詢以在負載下表現良好?

如果您不向我們展示gamesdeposits的模式,我們不會知道多少,但是如果您沒有games game_over的索引(或者更好的是,該順序中game_overid DESC的復合索引),以及deposits game_id索引(甚至更好的是game_iduser_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 byorder 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM