2011-12-05 71 views
1

我有一個簡單的查詢,通常在0.0002秒內完成。有時(例如,200箇中的1個)查詢需要長達1000倍的時間才能完成。簡單的mysql更新查詢有時很慢

慢查詢日誌:

# Time: 111205 12:21:21 
# [email protected]: abc[abc] @ localhost [] 
# Query_time: 0.120205 Lock_time: 0.000025 Rows_sent: 0 Rows_examined: 1 
SET timestamp=1323084081; 
UPDATE `users` 
SET `online`=NOW(), 
    lastip='123.123.123.123', 
    pageviews = pageviews + '1', 
    onlinetoday = '1' 
WHERE `user_name`='Alex' 
LIMIT 1; 

user_name字段建立索引。更新的字段(online,lastip,pageviewsonlinetoday)不是。使用主密鑰(A_I, int(35))代替user_name (varchar(50)當發生

相同的問題。

該表包含22000行和68個字段,其中5個是索引。

我也有一個具有相同問題的另一個表:

CREATE TABLE `person_values` (
`id` int(255) NOT NULL, 
`A1` int(255) NOT NULL DEFAULT '0', 
`A2` int(255) NOT NULL DEFAULT '0', 
`A3` int(255) NOT NULL DEFAULT '0', 
`A4` int(255) NOT NULL DEFAULT '0', 
`A5` int(255) NOT NULL DEFAULT '0', 
`A6` int(255) NOT NULL DEFAULT '0', 
`A7` int(255) NOT NULL DEFAULT '0', 
`A8` int(255) NOT NULL DEFAULT '0', 
`A9` int(255) NOT NULL DEFAULT '0', 
`A10` int(255) NOT NULL DEFAULT '0', 
`A11` int(255) NOT NULL DEFAULT '0', 
`A12` int(255) NOT NULL DEFAULT '0', 
`A13` int(255) NOT NULL DEFAULT '0', 
`A14` int(255) NOT NULL DEFAULT '0', 
`A15` int(255) NOT NULL DEFAULT '0', 
`A16` int(255) NOT NULL DEFAULT '0', 
`A17` int(255) NOT NULL DEFAULT '0', 
`A18` int(255) NOT NULL DEFAULT '0', 
`A19` int(255) NOT NULL DEFAULT '0', 
`A20` int(255) NOT NULL DEFAULT '0', 
`A21` int(255) NOT NULL DEFAULT '0', 
`A22` int(255) NOT NULL DEFAULT '0', 
`A23` int(255) NOT NULL DEFAULT '0', 
`A24` int(255) NOT NULL DEFAULT '0', 
`A25` int(255) NOT NULL DEFAULT '0', 
`A26` int(255) NOT NULL DEFAULT '0', 
`A27` int(255) NOT NULL DEFAULT '0', 
`A28` int(255) NOT NULL DEFAULT '0', 
UNIQUE KEY `person` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 

查詢:

UPDATE `person_values` SET A25 = A25 + 1 WHERE id = '1' LIMIT 1; 

person_values包含大約28 000行。

MySQL服務器版本:5.1.49-3日誌 MySQL客戶端版本:49年1月5日發行 :Debian的6.0.3

什麼可以引起此問題?

+1

嗨新手,這個信息太少,可能包括商店引擎,版本號,平臺(windows或linux) – ajreal

+1

'int(255)'?當真? – CAFxX

回答

0
  1. 請發佈您架構的相關部分:SHOW CREATE TABLE tbl_name
  2. 檢查您是否設置了user_name的索引大小, ,因爲您很可能使用了varchar列。你應該設置在字符的 長度的指標像這樣的列:CREATE INDEX part_of_name ON customer (name(10));
0

如果你不需要馬上回讀剛剛修改,你可以嘗試用REPLACE DELAYED更換您UPDATE語句行(注意:它們的語法不同!不幸的是,沒有UPDATE DELAYED ...),看看這是否有幫助。

0

如果這是InnoDB,我會回答:當行在緩衝池中時,更新速度很快,否則它應該首先加載到緩衝池中,然後更新,最後寫回。 MyISAM以類似的方式工作,它必須打開表格並找到記錄,以便更新它。因此,在某些時候進行簡單的查詢需要0.1秒,這是完全可以接受的。你可以增加相應的設置(比如MySQL可以打開多少個表格,如果MyISAM中使用了某些緩衝區)可以很少或者根本不會發生。