2014-04-02 32 views
1

最近幾天,隨機時間我的網站變得非常緩慢。我開始調查我能做的最好的事情。我看到MySQL進程正在使用我的服務器的可用內存的85-95%(我是否應該升級內存?)。等待MySQL表中的表級鎖

我檢查了我的MySQL進程的日誌,我注意到一個巨大的與查詢列表:

等待表級鎖

但我也注意到,是什麼,所有這些查詢與「表級鎖定」,只是與我的表有關的查詢,稱爲users

我有20個其他表,與持續查詢,但我沒有看到他們的名單..所以我想問題是與用戶表?

我想知道我該如何改進表格,並最終刪除表級鎖?

我也跑了這一點:

SHOW VARIABLES LIKE 'query_cache%'; 

這就造成了這一點:

query_cache_limit 
1048576 
query_cache_min_res_unit 
4096 
query_cache_size 
33554432 
query_cache_type 
ON 
query_cache_wlock_invalidate 
OFF 

請讓我知道我能做些什麼來改善我的數據庫/ MySQL的。

這是進程的列表:

| 228 | db_user | localhost | db_db| Query   | 5 | Waiting for table level lock | SELECT count(*) FROM users WHERE createtime>'1396411200' OR createtime='1396411200'     | 
    | 229 | db_user | localhost | db_db| Query   | 4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use | 
| 203 | db_user | localhost | db_db| Query   | 6 | Waiting for table level lock | SELECT SUM(cashedout) FROM users                  | 
| 204 | db_user | localhost | db_db| Query   | 4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use | 
| 205 | db_user | localhost | db_db| Query   | 1 | Waiting for table level lock | SELECT * FROM users WHERE id='12055'                 | 
| 206 | db_user | localhost | db_db| Query   | 2 | Waiting for table level lock | SELECT * FROM users WHERE id='22530'                 
| 197 | db_user | localhost | db_db| Query   | 3 | Waiting for table level lock | SELECT * FROM `users` WHERE `username` = 'ptc4life123' LIMIT 1          | 
| 200 | db_user | localhost | db_db| Query   | 3 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0050' WHERE use | 

這基本上就是全部鎖定進程的模樣。

+0

開始向用戶添加索引,特別是諸如用戶姓氏,部門,ID等字段......經常在查詢中使用的任何內容。 – smoore4

+0

索引?謹慎地闡述一下? (對不起,我對MySQL還是比較新的) – oliverbj

回答

2

在緩慢的時期之一,運行此命令:

show processlist; 

這將顯示您正在運行的實際SQL命令,以及地方尋找在添加索引的條款。如果可能,請發佈運行時間最長的SQL。

添加一個索引將是這樣的:

ALTER TABLE MYTABLE ADD INDEX idx_columnname (COLUMN_NAME ASC) ; 

但你要小心不要那樣做在一個生產週期。乍一看,你想在用戶表中的ID和用戶名列上做到這一點。

+0

請看我更新的問題。我已經列出了一些緩慢的進程。 – oliverbj

+0

太好了。當你運行它時,這個數字是多少? SELECT COUNT(*)FROM用戶 – smoore4

+0

返回 「24096」 – oliverbj

0

檢查表的存儲引擎。如果可能,更改爲Innodb,因爲它只會導致行級別鎖定。 即使您正在使用innodb表 (如果您未使用索引),正在運行的查詢可能會強制使用表鎖。

+0

你可以試着多解釋一下「索引」。我應該如何使用它們? – oliverbj

+0

索引是一個指向數據的指針。它將是一個二叉樹(最常見),它具有整行作爲葉節點。例如,主鍵是指向單個行的索引。區別在於它將被排序,以便您不必去執行全表掃描來獲取數據。 – Gooner

+0

如果你沒有建立索引,那麼它將工作,就像整個表將被鎖定,因爲它正在進行全表掃描而不是索引掃描。 – Gooner