Самый быстрый способ заполнить стол - PullRequest
1 голос
/ 19 июня 2009

Я пытаюсь найти самый быстрый способ вставить данные в таблицу (данные из выбора) Я всегда очищаю стол:

TRUNCATE TABLE table;

Затем я делаю это, чтобы вставить данные:

INSERT INTO table(id,total) (SELECT id, COUNT(id) AS Total FROM table2 GROUP BY id);

Кто-то сказал мне, что я не должен этого делать. Он сказал, что это будет намного быстрее:

CREATE TABLE IF NOT EXISTS table (PRIMARY KEY (inskey)) SELECT id, count(id) AS total FROM table2 GROUP BY id

Есть идеи на этот счет? Я думаю, что мое решение чище, потому что мне не нужно проверять стол. Это будет выполняться в режиме cron несколько раз в день

РЕДАКТИРОВАТЬ: Я не был ясен. Усечение всегда выполняется. Это самый быстрый вопрос, зачем вставлять все данные

Ответы [ 7 ]

2 голосов
/ 19 июня 2009

Я также думаю, что ваше решение чище, плюс решение от "кого-то", похоже, имеет некоторые проблемы:

  • фактически не удаляет старые данные, которые могут быть в таблице
  • create table ... select создаст столбцы таблицы с типами, основанными на том, что возвращает select. Это означает, что изменения в структуре таблицы table2 будут распространяться на таблицу. Это может или не может быть то, что вы хотите. По крайней мере, он вводит неявную связь, что я считаю плохой идеей.

Что касается производительности, я не вижу причин, почему один должен быть быстрее другого. Таким образом, применяется обычный совет: выбирайте самое чистое и удобное в обслуживании решение, тестируйте его, оптимизируйте только в случае проблем с производительностью

1 голос
/ 19 июня 2009

Ваше решение будет моим выбором, потеря разницы в производительности (если таковая имеется, в которой я не уверен, потому что вы не удаляете / не создаете таблицу и не пересчитываете тип столбца), незначительна и ИМХО лишняя чистота.

0 голосов
/ 20 июня 2009

Из руководства: Начиная с MySQL 5.1.32, TRUNCATE обрабатывается для целей двоичного ведения журнала и репликации как DROP TABLE, за которым следует CREATE TABLE, то есть как DDL, а не DML. Это связано с тем, что при использовании InnoDB и других механизмов хранения транзакций, где уровень изоляции транзакций не допускает ведение журнала на основе операторов (READ COMMITTED или READ UNCOMMITTED), оператор не регистрировался и реплицировался при использовании ведения журнала STATEMENT или MIXED режим.

Вы можете упростить вставку до:

INSERT INTO table
( SELECT id, COUNT(id) FROM table2 GROUP BY id );
0 голосов
/ 20 июня 2009

Я уверен, что любая разница во времени неразличима, но ваша IMHO предпочтительнее, потому что это один оператор SQL, а не два; любое изменение вашего оператора INSERT не требует дополнительной работы над другим оператором; и ваш не требует, чтобы хост подтвердил, что ваш INSERT соответствует полям в таблице.

0 голосов
/ 20 июня 2009

Я согласен с предложением "sleske" попросить вас протестировать его и оптимизировать решение самостоятельно. DIY!

Каждая уважающая себя БД даст вам возможность откатить вашу транзакцию. 1. Откат вашей INSERT INTO ... потребует от DB отслеживать каждую строку, вставленную в таблицу 2. Откат CREATE TABLE ... очень прост для DB - просто избавьтесь от таблицы.

Теперь, если бы вы разрабатывали и кодировали БД, что было бы быстрее? 1 или 2?

"чье-то предложение" имеет смысл, особенно если вы используете Oracle.

С уважением,
Шива

0 голосов
/ 19 июня 2009

Возможно, что-то было потеряно в переводе между кем-то и вами. Одна из возможностей, на которую он / она мог ссылаться - это DROP / SELECT INTO vs TRUNCATE / INSERT.

Я слышал, что последний быстрее, так как он минимально регистрируется (но опять же, какова конечная стоимость DROP здесь?). У меня нет жестких статистических данных, подтверждающих это.

0 голосов
/ 19 июня 2009
CREATE TABLE IF NOT EXISTS table (PRIMARY KEY (inskey))
SELECT  id, count(id) AS total
FROM    table2
GROUP BY
        id

Это не удалит старые значения из таблицы.

Если это то, что вы хотите, это действительно будет быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...