MySQL Create Table Like с переопределением движка - PullRequest
3 голосов
/ 09 января 2012

Я делаю сайт WordPress с одной базой данных и более чем 81 000 таблиц в несколько БД с помощью плагина от wpmudev.org.Основным мотиватором является производительность, и я проверил сами таблицы, и они имеют тип MyISAM.

Я думал, что при перемещении таблиц в новые базы данных я также мог бы изменить тип таблицы на InnoDB, который должен видеть производительность сайта.улучшение.

Скрипт для переноса таблиц из существующей базы данных в новую базу данных использует следующий синтаксис:

CREATE TABLE .... LIKE .... INSERT INTO .... SELECT* FROM ....

Я не смог бы найти информацию, если бы мог переопределить двигатель в команде CREATE TABLE, например:

CREATE TABLE .... LIKE .... ENGINE =InnoDB

Также мне интересно, является ли "INSERT INTO .... SELECT * FROM ...." наиболее эффективным способом вставки данных ... Это скрипт php, поэтому я не противдобавив немного кода для повышения производительности, которая - в более раннем испытании потребовалось 3 дня для работы на 4-ядерном 4 ГБ ОЗУ!

Ответы [ 4 ]

2 голосов
/ 23 декабря 2013

На этот вопрос также косвенно ответил другой вопрос, который помог мне, когда я пытался клонировать таблицу в движок MEMORY: как к копии-MySQL-таблицы структуры к столу-в-памяти

CREATE TABLE % ENGINE=InnoDB SELECT * FROM %

Надеюсь, это поможет кому-то, так же как и мне!

2 голосов
/ 14 января 2012

Да, я сделал только это (переопределить тип таблицы). Работает нормально.

Для больших передач, подобных этой, я обычно делал некоторую форму дампа базы данных, скрипт для массирования данных (например, смена типов движка), а затем восстановление новой базы данных. В текстовых дампах базы данных в основном используется COPY, что быстрее, чем INSERT INTO.

Вы также можете выдать ALTER TABLE {} ENGINE=INNODB;. Хотя это говорит о том, что у нового старта тоже есть много чего.

81 000 таблиц. Ничего себе.

1 голос
/ 10 октября 2016

Нельзя указать параметр ENGINE с синтаксисом create table like..., но есть несколько альтернатив:

CREATE TABLE `another_table` ENGINE=MEMORY SELECT * FROM `original`

... скопирует структуру таблицы и данные без ключей и триггеров

CREATE TABLE `another_table` ENGINE=MEMORY SELECT * FROM `original` WHERE 0

... скопирует только структуру, но не данные (потому что WHERE 0 отфильтрует все)

CREATE TEMPORARY TABLE `another_table` ) ENGINE=MEMORY SELECT * FROM `original`

... возможно, вы хотите добавить TEMPORARY слово, затемDB автоматически удалит таблицу при закрытии соединения

CREATE TABLE `another_table` ( INDEX(`id_column`) ) ENGINE=MEMORY SELECT * FROM `original`

... и это пример того, как воссоздать ключи в новой таблице (синтаксис определения ключей такой же, как в простом CREATE TABLEсинтаксис)

0 голосов
/ 26 марта 2019

Или просто:

 CREATE TABLE `another_table` ENGINE=MEMORY SELECT * FROM `original` LIMIT 0
...