2017-04-12 17 views
5

在Debian Jessie中,我安裝了MariaDB服務器10.0.30,並嘗試增加最大密鑰長度。 AFAIU取決於配置參數innodb_large_prefix被啓用。根據docs,它還需要barracuda文件格式和innodb_file_per_table如何在MariaDB 10中啓用大型索引?

> SHOW GLOBAL VARIABLES LIKE 'innodb_large%'; 
+---------------------+-------+ 
| Variable_name  | Value | 
+---------------------+-------+ 
| innodb_large_prefix | ON | 
+---------------------+-------+ 
1 row in set (0.00 sec) 

> SHOW GLOBAL VARIABLES LIKE 'innodb_file%'; 
+--------------------------+-----------+ 
| Variable_name   | Value  | 
+--------------------------+-----------+ 
| innodb_file_format  | Barracuda | 
| innodb_file_format_check | OFF  | 
| innodb_file_format_max | Antelope | 
| innodb_file_per_table | ON  | 
+--------------------------+-----------+ 
4 rows in set (0.00 sec) 

> SHOW GLOBAL VARIABLES LIKE 'innodb_page%'; 
+------------------+-------+ 
| Variable_name | Value | 
+------------------+-------+ 
| innodb_page_size | 16384 | 
+------------------+-------+ 
1 row in set (0.00 sec) 

我不知道,爲什麼innodb_file_format_max設置Antelope,但同時innodb_file_format_check爲OFF時,不應該的問題:在配置這些設置並重新啓動服務器我看到客戶端,這些參數是否設置正確後。其實,即使我也設置了Barracuda,它沒有區別。

如果我嘗試與現在一樣大的索引創建表:

CREATE TABLE `some_table` (
    `some_tableID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `column` varchar(750) COLLATE utf8mb4_estonian_ci NOT NULL DEFAULT '', 
    PRIMARY KEY (`some_tableID`), 
    KEY `column` (`column`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci; 

我得到錯誤:同一

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes. 

在Ubuntu 16.04使用MySQL服務器5.7.17的所有相關設置(默認情況下)並且大索引沒有問題(對於utf8mb4,它是750 * 4 = 3000)。

我的MariaDB設置有什麼問題?

+0

如果你添加了'ROW_FORMAT = DYNAMIC'? – Hackerman

+0

@Hackerman,不能再測試了,因爲放棄了MariaDB並回到MySQL –

+0

FWIW它與MariaDB無關; MySQL 5.6有同樣的問題。這在MariaDB 10.2中也不是問題。 –

回答

11

它需要的不僅僅是這兩個設置更多...

SET GLOBAL innodb_file_format=Barracuda; 
SET GLOBAL innodb_file_per_table=ON; 
SET GLOBAL innodb_large_prefix=1; 
logout & login (to get the global values); 
ALTER TABLE tbl ROW_FORMAT=DYNAMIC; -- or COMPRESSED 

也許你需要的是增加ROW_FORMAT=...CREATE TABLE

5.6.3至5.7.7需要這些說明。從5.7.7開始,系統默認正確處理較大的字段。

或者,你可以使用「前綴」指數:(但前綴索引是在許多方面有缺陷)

INDEX(column(191)) 

「如果服務器後來創建了一個較高的表格格式,innodb_file_format_max是設置爲該值「意味着該設置不是問題。

+1

我安裝了測試機器,現在可以確認:將'ROW_FORMAT = DYNAMIC'添加到'CREATE TABLE'語句中是缺失的部分。謝謝! –

5

innodb_large_prefix僅適用於COMPRESSEDDYNAMIC行格式。

MariaDB 10.0和10.1具有InnoDB 5.6,默認情況下會創建包含ROW_FORMAT=Compact(即使innodb_file_format設置爲Barracuda)的表格。因此,要使用大型前綴,您需要明確指定行格式。 MySQL 5.6也是如此。

的InnoDB 5.7在默認情況下ROW_FORMAT=DYNAMIC創建表,這就是爲什麼依靠在MySQL 5.7和MariaDB的10.2 innodb_large_prefix作品沒有任何附加條款相同CREATE