我有一位客戶要求我調整他的MySQL數據庫,以實現一些新功能並提高現有Web應用程序的性能。創建輔助表以提高大型MySQL表的性能?
最大的桌子(〜90 GB)擁有超過200M行,並且以定期間隔(每次訪問他擁有的任何一個網站時都會有一次)增長。由於連續的INSERT,從後端頁面執行的每個SELECT查詢需要一段時間才能完成,因爲每次都會重新生成索引。
我在我自己的服務器上從BTREE索引切換到HASH索引做了模擬。 SELECT和INSERT都沒有運行得更快。該表使用MyISAM作爲存儲引擎。只有INSERT和SELECT,沒有UPDATE或DELETE。
我想出了創建與每個INSERT一起更新的輔助表的想法,以加速來自後端的每個SELECT查詢。我知道這是不好的做法,但是,我確信統計頁面的表現會提高。
我不是一位數據庫性能專家,因爲您可能已經注意到了......是否有更好的方法呢?
順便說一下,從phpMyAdmin我看到,表上的大多數索引都有0的基數。在我的模擬中,這沒有發生。我不確定爲什麼會發生這種情況。
非常感謝。
第一次更新:我剛剛瞭解到,MyISAM引擎不支持散列索引。
第二次更新:好的。這是表格模式。
CREATE TABLE `visits` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` int(8) NOT NULL,
`webmaster_id` char(18) NOT NULL,
`country` char(2) NOT NULL,
`connection` varchar(15) NOT NULL,
`device` varchar(15) NOT NULL,
`provider` varchar(100) NOT NULL,
`ip_address` varchar(15) NOT NULL,
`url` varchar(300) NOT NULL,
`user_agent` varchar(300) NOT NULL,
PRIMARY KEY (`id`),
KEY `datetime` (`datetime`),
KEY `webmaster_id` (`webmaster_id`),
KEY `country` (`country`),
KEY `connection` (`connection`),
KEY `device` (`device`),
KEY `provider` (`provider`)
) ENGINE=InnoDB;
因此,而不是像執行查詢select count(*) from visits where datetime=20140715 and device="ios"
,會不會是最好從select count from visits_stats where datetime=20140715 and device="ios"
獲取呢?
如上所述,INSERT比SELECT更頻繁,但我的客戶希望提高用於檢索聚合數據的後端的性能。使用我的方法,每次訪問意味着一個INSERT和一個INSERT/UPDATE(或REPLACE),這會增加一個或多個計數器(我還沒有確定visitor_stats表的模式,上面的查詢只是一個例子)。
除此之外,我決定用某個外部表的合適ID替換一些字段。到目前爲止,數據存儲在像connection = cable,device = android等字符串中。我不確定這會如何影響性能。
再次感謝。
你爲什麼不發佈查詢,表和索引的定義以及執行計劃,使這裏的人真的可以試着幫你嗎? –