Атомарно копируя одну таблицу MySQL по другому?

Реализация формулы шнурка может быть выполнена в Numpy. Предполагая эти вершины:

import numpy as np
x = np.arange(0,1,0.001)
y = np.sqrt(1-x**2)

Мы можем переопределить функцию в numpy, чтобы найти область:

def PolyArea(x,y):
    return 0.5*np.abs(np.dot(x,np.roll(y,1))-np.dot(y,np.roll(x,1)))

И получить результаты:

print PolyArea(x,y)
# 0.26353377782163534

Избегать for цикл делает эту функцию примерно в 50 раз быстрее, чем PolygonArea:

%timeit PolyArea(x,y)
# 10000 loops, best of 3: 42 µs per loop
%timeit PolygonArea(zip(x,y))
# 100 loops, best of 3: 2.09 ms per loop.

Время выполняется в блокноте Jupyter.

8
задан DivideByHero 1 June 2009 в 17:06
поделиться

4 ответа

Использовать таблицу переименования

RENAME TABLE old_table TO backup_table, new_table TO old_table;

Она атомарна, работает на всех механизмах хранения и не требует перестраивания индексов.

11
ответ дан 5 December 2019 в 11:26
поделиться

В MySQL из-за поведения TRUNCATE я думаю, вам потребуется:

BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT TRANSACTION;

Я не уверен, что есть способ сделать то, что всегда эффективно безопасная транзакция операции DDL.

2
ответ дан 5 December 2019 в 11:26
поделиться

Вы можете использовать транзакции (для InnoDB ),

BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT;

или ТАБЛИЦЫ БЛОКИРОВКИ (для MyISAM ):

LOCK TABLES;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
UNLOCK TABLES;
2
ответ дан 5 December 2019 в 11:26
поделиться

Я не знаю, как MySQL работает с транзакциями, но в T-SQL вы можете написать

BEGIN TRAN
DELETE FROM SCORES
INSERT INTO SCORES SELECT * FROM SCORES_TEMP
COMMIT TRAN

Таким образом, ваша операция будет "атомарной", но не мгновенной.

0
ответ дан 5 December 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: