2017-04-12 8 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_maxAntelopeに設定されていますが、innodb_file_format_checkがOFFになっている一方で、それは問題ではないはずです。実際には、それもBarracudaと設定しても、違いはありませんでした。私は今のような大規模なインデックスを持つテーブルを作成してみてください場合

:デフォルトでは(同じMySQLサーバ5.7.17とUbuntuの16.04で

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

はすべて関連しているの設定:

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; 

私はエラーを取得します)、大きなインデックスに問題はありません(utf8mb4の場合は750 * 4 = 3000)。

MariaDBのセットアップで何が問題になっていますか?それはちょうどこれらの2つの設定よりも多く必要と

+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 

はおそらく、あなたが必要とするすべてはあなたのCREATE TABLEROW_FORMAT=...を追加することです。

5.6.3から5.7.7までの手順が必要です。 5.7.7から、システムはデフォルトで正しく、より大きなフィールドを処理します。

また、あなたは「接頭辞」のインデックスを使用できます。

INDEX(column(191)) 

を(。しかし、プリフィックス索引付けは、多くの方法で欠陥がある)

「サーバーが後で高いテーブル形式を作成する場合は、innodb_file_format_maxがありますその値に設定されている "とは、その設定が問題ではないことを意味します。

+1

テストマシンをインストールしました。これで、 'CREATE TABLE'文に' ROW_FORMAT = DYNAMIC'を追加することが欠落していることを確認できます。ありがとうございました! –

5

innodb_large_prefixは、COMPRESSEDDYNAMICのローフォーマットにのみ適用されます。

MariaDB 10.0と10.1には、デフォルトでROW_FORMAT=Compactのテーブルが作成されます(innodb_file_formatBarracudaに設定されていても)。したがって、大きな接頭辞を使用するには、明示的に行形式を指定する必要があります。 MySQL 5.6でも同じです。デフォルトで

のInnoDB 5.7は同じCREATEは、追加の句なしのMySQL 5.7とMariaDB 10.2でinnodb_large_prefix作品に頼る理由である、ROW_FORMAT=DYNAMICでテーブルを作成します。

関連する問題