2010-11-20 72 views
0

我有一個大的MySQL表(約5M行),我經常插入數據。Mysql併發選擇並插入數據庫緩慢

這張表是一樣的,我必須從中讀取數據,有時整個數據庫由於選擇數據而緩慢,而有很多未決的插入。

我在WHERE語句中使用的每個字段都放了索引,所以我真的不知道select爲什麼會這麼慢。

任何人都可以提供一個提示來解決這個問題嗎?

這裏是表和查詢

CREATE TABLE `messages` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `user_id` int(10) unsigned NOT NULL default '0', 
    `dest` varchar(20) character set latin1 default NULL, 
    `body` text character set latin1, 
    `sent_on` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `md5` varchar(32) character set latin1 NOT NULL default '', 
    `interface` enum('mobile','desktop') default NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    KEY `md5` (`md5`), 
    FULLTEXT KEY `dest` (`dest`,`body`), 
    FULLTEXT KEY `body` (`body`) 
) ENGINE=MyISAM AUTO_INCREMENT=7074256 DEFAULT CHARSET=utf8 

的SQL和這裏查詢:

EXPLAIN SELECT SQL_CALC_FOUND_ROWS id, sent_on, dest AS who, body,interface FROM messages WHERE user_id = 2 ORDER BY sent_on DESC LIMIT 0,50 \G; 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: messages 
     type: ref 
possible_keys: user_id 
      key: user_id 
     key_len: 4 
      ref: const 
     rows: 13997 
     Extra: Using where; Using filesort 
1 row in set (0.00 sec) 

回答

0

注意,在你的EXPLAIN輸出如下:

Extra: Using where; Using filesort 

Using filesort意味着MySQL正在傾倒查詢結果到文件進行排序,然後再讀取結果以獲得前50行。

雖然我不是專家,但我認爲你可以通過提供一個能夠同時滿足選擇標準和排序順序的索引來優化這個過程;那麼選擇和排序可以僅通過索引掃描來確定,而不必每次對結果集進行排序。

在這種情況下,您的WHERE位於user_id,您的ORDER BY位於sent_on。因此,理論上,如果您在這兩列上按順序提供單個索引,那麼引擎將能夠使用索引的前半部分來過濾結果,並且由於索引的後半部分處於打開狀態在sent_on列中,索引結果將按照該列的順序排列,從而允許MySQL簡單檢索該索引的前50個結果。不需要額外的排序。

聲明:我不是DBA。我可能完全錯誤。

另請參見:Mysql.com: Multiple Column Indexes

+0

它可能是一個解決方案,我只需要添加一個索引(user_id,sent_on)? – n0cturnal 2010-11-21 16:03:32

+0

嘗試一下,看看它是否有幫助。 ; -P – tylerl 2010-11-22 01:21:57

+0

fially我加了那個索引,你哪裏沒錯! filesort消失了。非常感謝! – n0cturnal 2010-11-28 09:37:51

0

也許你有殘疾Concurrent Inserts

+0

剛纔檢查...> SHOW VARIABLES LIKE '%併發%'; concurrent_insert | 1 – n0cturnal 2010-11-20 17:30:00

0

ORDER BY會讓你減慢嗎?我不知道,如果它是一個好主意,指數sent_on,這將取決於SELECT VS INSERT頻率

+0

我會嘗試這個夜晚,不可能在大型的生產桌上運行如此龐大的查詢。但謝謝你,我會報告會發生什麼 – n0cturnal 2010-11-21 16:06:16