2010-09-03 48 views
0

你好,這是我的表結構大MySQL表更新慢

CREATE TABLE IF NOT EXISTS `sms_report` (
`R_id` int(11) NOT NULL auto_increment, 
`R_uid` int(11) NOT NULL, 
`R_smppid` varchar(100) collate utf8_unicode_ci NOT NULL, 
`R_from` varchar(10) collate utf8_unicode_ci NOT NULL, 
`R_status` longtext collate utf8_unicode_ci NOT NULL, 
`R_message` text collate utf8_unicode_ci NOT NULL, 
`R_numbers` longtext collate utf8_unicode_ci NOT NULL, 
`R_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
`R_timedate` varchar(40) collate utf8_unicode_ci NOT NULL, 
`R_show` int(11) NOT NULL default '1', 
`oldformat` tinyint(1) NOT NULL default '0', 
PRIMARY KEY (`R_id`) 

)ENGINE = MyISAM的默認字符集= UTF8 COLLATE = utf8_unicode_ci AUTO_INCREMENT = 1947722;

我有大約200萬行,所以當我在這裏對R_status進行更新時,它似乎需要很長時間(R_status是1,2,16或24)。 請建議如何優化。

+0

您是僅基於WHERE子句中的R_id更新的嗎?或其他列?你可以發佈一個樣例'UPDATE'查詢嗎? – aularon 2010-09-03 08:39:57

+0

示例更新查詢將爲 update sms_report set R_status = 1其中R_smppid = 738sbdasdbajsdbdfbfbks782 | 9898773122 – 2010-09-03 08:42:17

回答

0

作爲@BarsMonster suggestd,轉換R_status成整數(TINYINT如果值僅1,2,16,24),和創建一個R_smppidINDEX。另外,如果R_smppid是固定寬度,請將字段類型更改爲char(40)或內容長度,或者如果可以將其轉換爲整數,則更好。

+0

什麼是索引? – 2010-09-03 08:50:11

+0

創建索引時,數據庫引擎會緩存一個訂購字段的版本,以便根據請求進行簡單快速的查找,因此,當您下次執行'UPDATE .. WHERE indexed_field = value'時,數據庫會更快地找到該行並更新它,看看這裏:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – aularon 2010-09-03 09:05:40

3

如果R_status始終爲整數,則將其設置爲整數。 此外,我會嘗試將此錶轉換爲固定行寬格​​式(無varchars /文本)

此外,使R_smppid上的索引,沒有它將執行每個更新的全表掃描。