Mysql
表大小對性能有多大影響?
假設我有一個包含 2938347 行的 MyISAM 表(在其他表中)。該表僅用於記錄,不會經常被清空。
通過不定期歸檔或刪除這些行,有這個表會影響伺服器性能嗎?
然後,如果 MySQL 伺服器上的表/數據庫很大,但不經常訪問呢?這些表與經常訪問/查詢的表共存,我想知道它們是否會導致問題。
大流士
這將取決於您發出的查詢(假設大表是
mydb.logtable
)。方面#1
首先,考慮一下 MyISAM 儲存引擎。它僅在 MyISAM 鍵記憶體中記憶體索引頁(大小為key_buffer_size)。如果針對 的任何查詢
mydb.logtable
從 讀取大量索引頁/var/lib/mysql/mydb/logtable.MYI
,則該查詢將清除其他表中的索引頁。這將導致對那些其他表的其他查詢必須再次從磁碟重新讀取它們的索引頁。方面#2
對不經常訪問的大型 MyISAM 表的任何查詢都可能具有舊的索引統計資訊,可能會導致全表掃描。在非工作時間,您應該設置一個執行此 SQL 命令的 crontab 作業:
ANALYZE TABLE mydb.logtable;
這將重建索引統計資訊。
方面#3
無論儲存引擎(甚至 RDBMS)如何,任何請求超過表總大小 5% 的查詢都會導致 MySQL 查詢優化器停止使用索引並進行全表掃描。例如,如果您查詢一年的數據,而一個表包含少於 20 年的日誌資訊,那麼很可能會發生全表掃描。
方面#4
如果索引的基數非常低,某個鍵組合可能會導致查詢不使用任何索引並進行全表掃描。
有關影響查詢性能和解釋普通生成的低基數的展示,請參閱我
Nov 13, 2012
的文章必須索引覆蓋所有選定的列才能用於 ORDER BY?建議
您應該安排某種形式的日誌輪換。也許是這樣:
SET @tb1 = 'mydb.logtable'; SET @tb2 = CONCAT(@tb1,'_',date_format(now(),'%Y%m%d_%H%i%s')); SELECT CONCAT('ALTER TABLE ',@tb1,' RENAME ',@tb2) INTO @sql_1; SELECT CONCAT('CREATE TABLE ',@tb1,' LIKE ',@tb2) INTO @sql_2; PREPARE s FROM @sql_1; EXECUTE s; DEALLOCATE PREPARE s; PREPARE s FROM @sql_2; EXECUTE s; DEALLOCATE PREPARE s;
這將使日誌文件保持精簡和平均並存檔最新條目。