課程
/云計算&大數據
/大數據
/走近大數據之Hive進階
在插入文件到分區表得時候報錯,說MySQL里最大只能是767
2017-09-07
源自:走近大數據之Hive進階 2-1
正在回答
大家應該知道InnoDB單列索引長度不能超過767bytes,聯合索引還有一個限制是長度不能超過3072。
mysql>?CREATE?TABLE?`tb`?(??
????->???`a`?varchar(255)?DEFAULT?NULL,??
????->???`b`?varchar(255)?DEFAULT?NULL,??
????->???`c`?varchar(255)?DEFAULT?NULL,??
????->???`d`?varchar(255)?DEFAULT?NULL,??
????->???`e`?varchar(255)?DEFAULT?NULL,??
????->???KEY?`a`?(`a`,`b`,`c`,`d`,`e`)??
????->?)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;??
ERROR?1071?(42000):?Specified?key?was?too?long;?max?key?length?is?3072?bytes?
可以看到,由于每個字段占用255*3, 因此這個索引的大小是3825>3072,報錯。
為什么3072
???????? 我們知道InnoDB一個page的默認大小是16k。由于是Btree組織,要求葉子節點上一個page至少要包含兩條記錄(否則就退化鏈表了)。
? ? ? ? ?所以一個記錄最多不能超過8k。
??????? 又由于InnoDB的聚簇索引結構,一個二級索引要包含主鍵索引,因此每個單個索引不能超過4k (極端情況,pk和某個二級索引都達到這個限制)。
???????? 由于需要預留和輔助空間,扣掉后不能超過3500,取個“整數”就是(1024*3)。?
單列索引限制
???????? 上面有提到單列索引限制767,起因是256×3-1。這個3是字符最大占用空間(utf8)。但是在5.5以后,開始支持4個字節的uutf8。255×4>767, 于是增加了一個參數叫做 innodb_large_prefix。
???????? 這個參數默認值是OFF。當改為ON時,允許列索引最大達到3072。
可以看到默認行為是建表成功,報一個warning,并且將長度階段為255。
注意要生效需要加row_format=compressed或者dynamic ? ? 百度了一下 ?
舉報
Hive數據操作,查詢及Hive編程接口,開發Hive的自定義函數
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2017-09-15
大家應該知道InnoDB單列索引長度不能超過767bytes,聯合索引還有一個限制是長度不能超過3072。
mysql>?CREATE?TABLE?`tb`?(??
????->???`a`?varchar(255)?DEFAULT?NULL,??
????->???`b`?varchar(255)?DEFAULT?NULL,??
????->???`c`?varchar(255)?DEFAULT?NULL,??
????->???`d`?varchar(255)?DEFAULT?NULL,??
????->???`e`?varchar(255)?DEFAULT?NULL,??
????->???KEY?`a`?(`a`,`b`,`c`,`d`,`e`)??
????->?)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;??
ERROR?1071?(42000):?Specified?key?was?too?long;?max?key?length?is?3072?bytes?
可以看到,由于每個字段占用255*3, 因此這個索引的大小是3825>3072,報錯。
為什么3072
???????? 我們知道InnoDB一個page的默認大小是16k。由于是Btree組織,要求葉子節點上一個page至少要包含兩條記錄(否則就退化鏈表了)。
? ? ? ? ?所以一個記錄最多不能超過8k。
??????? 又由于InnoDB的聚簇索引結構,一個二級索引要包含主鍵索引,因此每個單個索引不能超過4k (極端情況,pk和某個二級索引都達到這個限制)。
???????? 由于需要預留和輔助空間,扣掉后不能超過3500,取個“整數”就是(1024*3)。?
單列索引限制
???????? 上面有提到單列索引限制767,起因是256×3-1。這個3是字符最大占用空間(utf8)。但是在5.5以后,開始支持4個字節的uutf8。255×4>767, 于是增加了一個參數叫做 innodb_large_prefix。
???????? 這個參數默認值是OFF。當改為ON時,允許列索引最大達到3072。
可以看到默認行為是建表成功,報一個warning,并且將長度階段為255。
注意要生效需要加row_format=compressed或者dynamic ? ? 百度了一下 ?