Mysql

Varchar 索引

  • July 11, 2014

我對 MySQL 很生疏,我想要一些建議。

我有幾個軟體工具部署在整個公司,我正在編寫一個 DLL 來跟踪其中一些工具的使用、錯誤和內容。

我想跟踪的一件事是有關電腦處理器的資訊,更具體地說是 CPUID 命令返回的字元串,例如:Intel(R) Xeon(R) CPU E3-1270 V2 @ 3.50GHz

我們沒有非常多樣化的處理器(我認為),我們有 6000 多個工作站,我的問題是:

  1. 在這種情況下,如果我在表中創建一個 VARCHAR(64) 列並為其創建索引,這是一個好的解決方案嗎?
  2. MySQL 將如何儲存它?假設我只有 10 個不同的處理器,所以只有 10 個不同的字元串,每一行會儲存整個字元串,還是只是一個“id”?
  3. GROUP BY 使用這個索引列會有效嗎?

我正在使用 MySQL 5.1(我知道它很舊……)和 InnoDB 表

謝謝!

您似乎正在考慮基於列的儲存系統(或者您可能來自該背景)。

MySQL(尤其是 InnoDB)將其行儲存在其主鍵周圍,並且任何其他二級索引都儲存在 B+Tree 結構中。

因此,如果您將文本儲存在其中varchar(64)並對其進行完全索引,它將佔用 - 儲存實際上是動態的 - 64 * charset 字節大小(MySQL 的 utf8 為 3)+ 一些額外內容(長度,空值的可能性,PKs on二級索引等)* 2(儲存一次“行內”,第二次儲存在二級索引上)* numrows。

我建議的第一件事是,如果您只有很少的記錄不同,請手動將您註釋的“id”替換與外鍵連結到單獨的表

除了通過使用覆蓋索引將其操作記憶體在記憶體中的可能性之外**,GROUP BY 通常在 MySQL 中效率不高。**使用非規範化和預先計算的值有一些技巧。您甚至可以設置外部軟體以獲得更合適的索引。但是對於 6000 行,您可能不需要更高級的解決方案。僅使用數字 ID 而不是文本可能會使您的數據集適合記憶體,使其足夠快以滿足您的目的。

引用自:https://dba.stackexchange.com/questions/71293