programing

MariaDB 10에서 대용량 인덱스를 활성화하려면 어떻게 해야 합니까?

bestcode 2023. 1. 12. 22:13
반응형

MariaDB 10에서 대용량 인덱스를 활성화하려면 어떻게 해야 합니까?

Debian Jessie에서 MariaDB 서버 10.0.30을 설치하였고, 최대 키 길이를 늘리려고 합니다.AFIU 설정 파라미터에 따라 달라집니다.innodb_large_prefix유효하게 되어 있습니다.의사들에 따르면, 그것은 또한,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_max설정되어 있다Antelope단,innodb_file_format_check꺼진 상태이므로 상관없습니다.사실, 제가 이걸 가지고 있어도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.

mysql 서버가 5.7.17인 Ubuntu 16.04에서는 모든 관련 설정이 동일하며(기본값), 큰 인덱스에 문제가 없습니다(utf8mb4의 경우 750*4 = 3000).

MariaDB 설정에 문제가 있습니까?

이 두 가지 설정뿐만 아니라...

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부터는 큰 필드를 처리할 수 있도록 시스템이 올바르게 기본 설정됩니다.

또는 "prefix" 인덱스를 사용할 수 있습니다.

INDEX(column(191))

(단, 프리픽스인덱스에는 여러 가지 결함이 있습니다).

"서버가 나중에 더 높은 테이블 형식을 만들 경우 innodb_file_format_max는 이 값으로 설정됩니다."는 설정은 문제가 되지 않음을 나타냅니다.

innodb_large_prefix에만 적용되다COMPRESSED그리고.DYNAMIC행 형식을 지정합니다.

MariaDB 10.0 및 10.1에는 InnoDB 5.6이 있으며 기본적으로는 다음과 같은 테이블이 생성됩니다.ROW_FORMAT=Compact(비록innodb_file_format로 설정되어 있다.Barracuda따라서 큰 프레픽스를 사용하려면 행 형식을 명시적으로 지정해야 합니다.MySQL 5.6도 마찬가지입니다.

기본적으로 InnoDB 5.7은 다음을 사용하여 테이블을 만듭니다.ROW_FORMAT=DYNAMIC같은 이유로CREATE의지하다innodb_large_prefix는 추가 구문을 사용하지 않고 MySQL 5.7 및 MariaDB 10.2에서 작동합니다.

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

아직까지는 좋아.

세션에 대한 해결 방법은 여기에 있다고 생각합니다만, 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'

재작업이나 머리 긁힘을 줄이는 데 도움이 되길 바랍니다.

추가 중ROW_FORMAT=DYNAMIC제 CREATE 쿼리가 효과가 있었어요.

당신의 경우는 다음과 같습니다.

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 ROW_FORMAT=DYNAMIC;

언급URL : https://stackoverflow.com/questions/43379717/how-to-enable-large-index-in-mariadb-10

반응형