web-dev-qa-db-ja.com

MariaDB 10で大きなインデックスを有効にする方法は?

Debian JessieにMariaDBサーバー10.0.30をインストールし、最大キー長を増やしようとしました。 AFAIUそれは設定パラメータに依存しますinnodb_large_prefix有効化されています。 docs によると、barracudaファイル形式とinnodb_file_per_table。 configで設定し、クライアントでサーバーを再起動すると、これらのパラメーターが正しく設定されていることがわかります。

> 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も設定していても、違いはありませんでした。

私が今のような大きなインデックスを持つテーブルを作成しようとすると:

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のセットアップの何が問題になっていますか?

14
w.k

これらの2つの設定以上のものが必要です...

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はその値に設定されます」は、その設定が問題ではないことを意味します。

25
Rick James

innodb_large_prefixは、COMPRESSEDおよびDYNAMIC行形式にのみ適用されます。

MariaDB 10.0および10.1にはInnoDB 5.6があり、デフォルトではROW_FORMAT=Compactでテーブルを作成します(innodb_file_formatBarracudaに設定されている場合でも)。そのため、大きなプレフィックスを使用するには、行形式を明示的に指定する必要があります。 MySQL 5.6についても同様です。

InnoDB 5.7はデフォルトでROW_FORMAT=DYNAMICを使用してテーブルを作成します。これが、innodb_large_prefixに依存する同じCREATEが追加の句なしでMySQL 5.7およびMariaDB 10.2で機能する理由です。

9
elenst

セッションの解決策はここで答えられると思いますが、MySQLを再起動すると、これらの設定は機能しないと思います。

永続的な解決策として、My.Iniファイルに次のコードを入力する必要があります。

## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'

やり直しや頭の傷の軽減に役立つことを願っています:)

0
Techifylogic

@Rickが提供するステップの後:

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);

最後のステップを

SET GLOBAL innodb_default_row_format=DYNAMIC;

ここまでは順調ですね。

0
Kojo