0

我有了一列的表:在MySQL解釋key_len此表

| last_name | varchar(1000) | NO | MUL | NULL | |

我創建了此列的索引:
CREATE INDEX lastname_idx ON employees(last_name);

當我一個做EXPLAINSELECT是對last_name我看到一個WHERE條件:
key_len = 769

如果我沒看錯的key_len顯示從索引值使用的字節。
由於該指數是last_name這是varchar(1000)爲什麼是key_len=769
是不是應該是1000

+2

如果我在InnoDB表中創建一個索引(不是MyISAM),我會收到一個警告:'Warning | 1071 |指定的密鑰太長;最大密鑰長度是767字節',這可能與此有關... – Wrikken 2013-04-27 21:29:11

+0

@Wrikken:看起來你是對的。沒有注意到警告。 – Cratylus 2013-04-28 21:11:25

回答

1

InnoDB的存儲與其他列在頁面上串科拉姆的只有前端部分,高達768個字節,默認的行格式。任何多餘部分都存儲在表空間的另一個段的「blob頁面」上。

InnoDB使用用於VARCHAR,BLOB,TEXT,VARBINARY等相同的存儲方法(所有的 「可變長度」 的數據類型)。對於更多的存儲細節,參見http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

似乎InnoDB的自動假定索引前綴長度等於它可以內聯存儲的列的一部分。你使用MySQL 5.6嗎?我不記得在早期版本中看到這種行爲(它只是抱怨,而且你必須聲明一個索引前綴長度)。

當您使用varchar時,EXPLAIN報告的key_len總是包含一對額外的字節。

+0

我正在使用'5.5.15' – Cratylus 2013-04-28 21:21:51