使用 varchar(15) PK 會在多大程度上影響我的表性能?
我正在將遺留的專有應用程序中的日誌文件行解析為一個易於查詢的數據庫。日誌行沒有唯一的整數 ID。它們確實有一個 UNIX 時間戳作為 8 個字元的十六進製字元串。遺憾的是,這些時間戳並不總是保證是唯一的。還有一個 2-6(因此是
VARCHAR
)字元的十六進制 ID,當附加到時間戳時,它是唯一的。我用大約 40 萬條記錄對此進行了測試,僅僅SELECT *
在桌子上做一個就需要 15 秒以上。在我以某種激烈的方式完全重新設計我的表之前,我想確定使用這個 PK(而不是自動遞增
INT
)是我的性能影響所在。INT
除了正常PK(我是開發人員,而不是 DBA),我從來沒有真正使用過其他東西來處理表。我正在使用 InnoDB 引擎和一些與一些小表的 FK 關係。MySQL 管理員顯示表的數據長度約為 150MB,索引長度為 21MB,行數為 380k。
正如我所說,我是一名開發人員,而不是一名 DBA,但在我目前的情況下,我真的沒有一個可以引入的人。我做了一些Google搜尋,但發現了很多答案,這些答案通常會深入研究那些只是為我提出了更多的問題。我希望這裡有人可以給出簡明的答案,或者至少為我指出更多資源。
編輯:將列更改為
CHAR(14)
並刪除了一個TEXT
有點多餘的大列。這似乎大大縮短了時間,並將表大小減少到大約 80MB,但我仍在尋找建議。
我不知道PK是你的問題。對我來說,請求所有 400k 行,15 秒聽起來還不錯。當您嘗試過濾集合(使用 WHERE 條件)時,PK 和索引確實進入了等式。
“我想確定使用這個 PK(而不是自動遞增的 int)是我的性能目標。”
如果您可以使用自動遞增的主鍵重新創建您的表並針對這個新表測試您的解析,那麼您肯定會發現。
“將列更改為 char(14) 並刪除了大型 TEXT 列,這有點多餘。這似乎大大縮短了時間,並將表大小減少到大約 80MB,但仍在尋找建議。”
您是否一步完成了這兩項更改?當然,我可以推測刪除一個大
TEXT
列會比將 a 更改VARCHAR(15)
為 a更能減少您的 I/O,CHAR(14)
但您可以自己證明- 沒有比設計和執行可重現的測試更好的方法來處理性能問題,並且我們在這個過程中學習負荷