私はチャットメッセージを保存するこのスキーマを持っています。現在私は、約5.5MBのデータである約100k行を持っています。インデックスのサイズは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に未塗り領域を残していると、インデックスがテーブル自体より大きくなることがあります。 –
ところで、 "author"と "dest"の代わりに "user1"と "user2"を格納し、2人のユーザーをアルファベット順に並べ、 "user1"を最初のユーザーにすることで、インデックスのサイズを減らしてクエリのパフォーマンスを向上させることができます。 "user2"は2番目です。 MarkとAliceの会話を探したい場合、Aliceは常に「user1」になり、Markは常に「user2」になります。次に、「user1」が作成者か受信者かを示す別の列を追加できます。 –