Какой самый быстрый способ реализации алгоритма для манипулирования и вставки записей SQL? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть таблица с именем TRENDS , содержащая около 20 тыс. Записей. Мне нужно манипулировать каждой строкой таблицы TRENDS на основе значения каждого столбца, а конечный результат строки - это строка с именем insight, которая является ничем иным, как этой манипулируемой строкой. И затем мне нужно сохранить это понимание в таблице INSIGHTS . Наряду с пониманием я генерирую еще 3 запроса, которые находятся в трех отдельных функциях. Результат каждого запроса сохраняется в другой таблице с именем FACTS вместе с insight_id, указывающим, что эти 3 факта принадлежат одной и той же информации.

Поскольку данные находятся в базе данных mysqlЯ использовал библиотеку Python mysql-connector для запуска моих сценариев для операций поиска и вставки. С каждым пониманием и 3 фактами я выполняю execute () и commit (), который занимает 3 секунды для вставки одного набора записей, и это 20 тысяч повторений в таблице TRENDS, выполнение которой занимает много времени.

Какой самый быстрый способ решить эту проблему? Пожалуйста, предложите лучший алгоритм, если это возможно.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Самый быстрый метод, вероятно, состоит в том, чтобы использовать хранимую процедуру, которую вы вызываете только один раз, чтобы избежать обходов (т. Е. Ваше приложение вызывает MySQL, ожидает ответа, отправляет утверждение, получает одобрение, выполняет выражение, получаетсообщение об успехе, ...). Что касается вставки трех фактов, вы, вероятно, можете сделать это одно утверждение, используя UNION ALL.

Вот пример:

CREATE PROCEDURE myproc
BEGIN
  DECLARE v_first_new_insight_id INT DEFAULT 2147483647;

  START TRANSACTION;

  UPDATE trends SET insight = col1 + col2 + col3 + DATE_FORMAT(CURRENT_DATE, '%d');

  INSERT INTO insights (insight) SELECT insight FROM trends;

  SET v_first_new_insight_id = LAST_INSERT_ID(); 

  INSERT INTO facts (insight_id, fact)
  SELECT insight_id, get_fact1(insight) FROM insights WHERE insight_id >= v_first_new_insight_id
  UNION ALL
  SELECT insight_id, get_fact2(insight) FROM insights WHERE insight_id >= v_first_new_insight_id
  UNION ALL
  SELECT insight_id, get_fact3(insight) FROM insights WHERE insight_id >= v_first_new_insight_id
  ;

  COMMIT;  
END
0 голосов
/ 08 ноября 2019

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

  • Существует много накладных расходов на исключение запроса, если вы будете читать и писать по одной строке за раз, вы будете тратить огромное количествовремени выполнения для ожидания выполнения запросов
  • Массовые операции выполняются намного быстрее, почему бы не прочитать все строки по 20 КБ, а затем записать обратно по 20 КБ, или если это слишком требовательно для вашей локальной системы, почему бы не выполнить 1000 одновременно?
  • ... или посмотрите, можете ли вы написать запрос, который завершает всю операцию в SQL
...