Czy mysqldump domyślnie eksportuje indeksy?


20

Grałem około trochę z mysqldump i zastanawiałem się, czy to robi wskaźników eksportowych ( FULLTEXT, INDEX...) domyślnie. I przeczytać na nią i znalazłem tę opcję :

--disable-keys, -K

co sugeruje, że faktycznie eksportuje indeksy. Ale nie chcę ufać mojej interpretacji i chcę się upewnić, że mam rację (lub źle ;-)). Czy ktoś może to potwierdzić?


Odśwież. Zaktualizowałem swoją odpowiedź przykładowymi fragmentami mysqldump.
RolandoMySQLDBA

Odśwież. Zaktualizowałem swoją odpowiedź, dodając dodatkowe zastrzeżenie dotyczące wyłączania klawiszy i włączania klawiszy.
RolandoMySQLDBA

Odśwież. Zaktualizowałem swoją odpowiedź, dodając dodatkowe zastrzeżenia dotyczące obchodzenia WYŁĄCZONYCH KLUCZY i odrzucania obszarów tabel.
RolandoMySQLDBA

To pytanie zasługuje na +1, ponieważ jestem prawie pewien, że wielu miało na myśli to samo pytanie, ale bało się je zadać. Zapytałeś, dostajesz +1 !!!
RolandoMySQLDBA

@RolandoMySQLDBA: Włożyłeś dużo wysiłku w swoją odpowiedź. Dziękuję Ci bardzo!!
Aufwind

Odpowiedzi:


16

Nie, nie eksportuje indeksów. Indeksy są odbudowywane po wczytaniu mysqldump z powrotem do mysql. Dostępne opcje „--disable-keys” powodują, że mysqldump zapisuje coś takiego przed załadowaniem tabeli przez INSERT:

DROP TABLE IF EXISTS `tblAccountLinks`;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE `tblAccountLinks` (
  `ID` int(11) NOT NULL auto_increment,
  `FirmNo` varchar(10) NOT NULL,
  `CustomerNo` varchar(20) NOT NULL,
  `AccountNo` varchar(20) NOT NULL,
  `LinkType` smallint(6) NOT NULL,
  `AccessLevel` smallint(6) NOT NULL,
  `Status` smallint(6) NOT NULL,
  `CreatedOn` datetime NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=27023 DEFAULT CHARSET=latin1;
SET character_set_client = @saved_cs_client;

--
-- Dumping data for table `tblAccountLinks`
--

LOCK TABLES `tblAccountLinks` WRITE;
/*!40000 ALTER TABLE `tblAccountLinks` DISABLE KEYS */;
INSERT INTO `tblAccountLinks` VALUES (1,'F0001','C001','T00000001',1,2,1,'2008-06-30 07:55:43'),(2,'
F0001','C001','T00000002',2,2,1,'2008-06-30 07:55:43'),(3,'F0001','C002','27601012',1,2,1,'2008-06-3 ...

Linia po LOCK TABLES to

/*!40000 ALTER TABLE `tblAccountLinks` DISABLE KEYS */;

Właśnie to opcja --disable-keys osadza w mysqldump.

Jest to również osadzone po wykonaniu wszystkich WSTAWEK

/*!40000 ALTER TABLE `tblAccountLinks` ENABLE KEYS */;
UNLOCK TABLES;

CAVEAT # 1

DISABLE KEYS i ENABLE KEYS zostały zaimplementowane w celu wyłączenia przeładowywania nieunikalnych indeksów podczas przeładowywania tabeli. Klucze podstawowe i klucze unikatowe nie są wyłączone. Są ładowane w tym samym momencie, w którym są WSTAWKI. Po WŁĄCZENIU KLUCZÓW, niejednoznaczne indeksy są odbudowywane przez sortowanie (lub użycie pamięci podręcznej kluczy MyISAM oznacza, że ​​nie ma wystarczającej ilości dostępnej pamięci)

Niestety DISABLE KEYS i ENABLE KEYS działają tylko dla tabel MyISAM, a nie InnoDB.

CAVEAT # 2

Nie musisz --disable-keys. Można je wyłączyć WYŁĄCZAJĄC KLUCZE (bez użycia słów) za pomocą --skip-disable-keys:

  -K, --disable-keys  '/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and
                      '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put
                      in the output.
                      (Defaults to on; use --skip-disable-keys to disable.)

Może to spowodować wolniejsze ładowanie i potencjalne przewracanie stron indeksu dla indeksów nietypowych.

CAVEAT # 3

Możesz zrzucić rzeczywiste obszary tabel InnoDB (MySQL 5.5.12)

  -Y, --all-tablespaces 
                      Dump all the tablespaces.
  -y, --no-tablespaces 
                      Do not dump any tablespace information.

1
Pamiętaj, że jest to nieaktualne, MySQL 5.7 zawiera indeksy.
Erica Kane
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.