2011-05-26 179 views
-2

我有一個表中有6098369條記錄並且正在增長。 查詢真的很慢,我想知道你是否有任何提示我的情況。MySQL緩慢查詢

下面是create table語句:

CREATE TABLE `sametime`.`message` (
    `messageID` int(100) unsigned NOT NULL AUTO_INCREMENT, 
    `timestamp` datetime DEFAULT NULL, 
    `userFrom` varchar(80) DEFAULT NULL, 
    `userTo` varchar(80) DEFAULT NULL, 
    `msg` varchar(65000) DEFAULT NULL, 
    `conversationID` int(100) DEFAULT NULL, 
    PRIMARY KEY (`messageID`), 
    KEY `userFromIndex` (`userFrom`(5)), 
    KEY `userToIndex` (`userTo`(5)), 
    KEY `timestampIndex` (`timestamp`) 
) ENGINE=InnoDB AUTO_INCREMENT=6098370 DEFAULT CHARSET=latin1; 

正如你可以看到我已經添加索引與工作的希望。

任何提示?

+3

您是否嘗試過使用MySQL的EXPLAIN? – ceejayoz 2011-05-26 15:37:58

+3

你能否提供緩慢的特定查詢和他們的解釋計劃? – Olaf 2011-05-26 15:38:31

+1

我們需要查看緩慢的查詢 – cusimar9 2011-05-26 15:40:48

回答

4

沒有看到您的選擇語句很明顯,在VARCHAR用戶名上搜索此表將比在整數索引字段上搜索慢得多。 您應該考慮將用戶名移動到單獨的表中,並在該表中包含userNo外鍵。

另外,在會話ID上沒有索引?這不是一個關鍵的查找字段嗎?

除了ceejayoz提到的之外,MySQL的EXPLAIN語句應該是您的第一條途徑。

+0

+1,表中還有一些不一致('conversID INT(100)'不是很好)。索引選擇不佳的過度索引表格會很慢。另外,什麼是InnoDB配置?這樣一張小桌子上的6千個記錄不應該造成很大的問題。 – 2011-05-26 15:49:54

1

沒有看到的是緩慢的實際查詢...

嘗試在UserFrom,TimestampUserTo,Timestamp使用compound index

1

沒有具體的查詢和EXPLAIN輸出沒有太多可以說。不過,我會將msgVARCHAR(650000更改爲TEXT,因爲對於MySQL放入內存的每一行,將分配整個65000字節。

另外我很好奇 - 爲什麼你用INT(100)?它不允許您將2^100值存儲在其中,只需2^32就像常規INT那樣。 INT(100)僅在顯示選項AFAIR中有所不同。

0

嗯,我想我想出了我的主要問題。造成速度慢的主要原因是我沒有將conversationID設置爲外鍵。我也接受了關於桌子設計的其他建議。 感謝您的回覆