我有這個模式可以保存聊天消息。目前我有大約10萬行,大約5.5MB的數據。索引大小是6.5MB。當數據大小爲〜4MB時,指數大小爲〜3MB,因此它正在成倍增長?優化表以減少索引大小
CREATE TABLE `messages` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`author` int(11) unsigned DEFAULT NULL,
`time` int(10) unsigned DEFAULT NULL,
`text` text,
`dest` int(11) unsigned DEFAULT NULL,
`type` tinyint(4) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `history` (`author`,`dest`,`id`) USING BTREE,
KEY `messages_ibfk_1` (`dest`),
FULLTEXT KEY `msg` (`text`),
CONSTRAINT `au` FOREIGN KEY (`author`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `messages_ibfk_1` FOREIGN KEY (`dest`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=105895 DEFAULT CHARSET=utf8;
我正在運行鍼對該表和我一直試圖優化它的是,當我需要顯示分頁歷史聊天2人
SELECT id, time, text, dest, type, author
FROM `messages`
WHERE (
(author = ? AND dest = ?) OR (author = ? AND dest = ?)
) AND id <= ? ORDER BY id DESC LIMIT ?, 25
之間的主查詢對歷史記錄的其他查詢是相同的,除了它們具有用於搜索詞或日期範圍的附加過濾器。
有什麼可以做的,以減少索引大小和保持最佳性能?
爲什麼你認爲索引大小與性能有關?您的查詢運行緩慢嗎?畢竟,如果你沒有索引,那麼你會節省很多空間,但是你的查詢會慢很多,所以顯然有一個索引是一個空間性能折衷,通過索引,你我們表達了以犧牲太空爲代價的表現。 –
如果MySQL爲了將來插入而在btree中留下一些未填充的空間,那麼您的索引可能會大於表本身。 –
順便說一下,您可以通過存儲「user1」和「user2」而不是「author」和「dest」,按字母順序排列這兩個用戶,並使「user1」成爲第一個用戶,從而減少索引大小並提高查詢性能。第二個是「user2」。所以如果你想找到馬克和愛麗絲之間的對話,愛麗絲將永遠是「用戶1」,馬克將永遠是「用戶2」。然後,您可以添加另一列來指示「user1」是作者還是收件人。 –