вторник, 29 декабря 2015 г.

Быстрое удаление из больших таблиц MySQL

Если требуется удалить большие объёмы данных из таблиц MySQL, это занимает слишком много времени.

Ускорить процесс может такая процедура.

# Пример использования процедуры:
# CALL cut_table('my_cool_table');


DROP PROCEDURE IF EXISTS cut_table;

DELIMITER //
CREATE PROCEDURE cut_table(IN tableName CHAR(255))
BEGIN

SET @tableName = tableName;
SET @tableNameOld = CONCAT(@tableName, '_old');
SET @tableNameCopy = CONCAT(@tableName, '_copy');

# Количество строк, которые мы оставляем в начале и конце таблицы.
SET @skipCount = 10000;

# Считаем общее количество строк в таблице.
SET @sql_text = CONCAT('SELECT count(*) INTO @totalRows FROM ', @tableName);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT @totalRows;

SET @minRows = @skipCount*2;

# Если строк мало, то не обрезаем таблицу.
# Эта проверка спасает нас, если мы вызовем скрипт дважды для одной таблицы.
IF (@totalRows <= @minRows) THEN 
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Table has too few rows. No need to suck it.';
END IF;

# Создаём структурную копию таблицы.
# Внешние ключи не копируются, их требуется задать отдельно.
SET @sql_text = CONCAT('CREATE TABLE ', @tableNameCopy, ' LIKE ', @tableName);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

# Копируем те данные, которые нам нужны.
SET @sql_text = CONCAT('INSERT INTO ', @tableNameCopy, ' SELECT * FROM ', @tableName, ' ORDER BY id ASC LIMIT ?');

PREPARE stmt FROM @sql_text;
EXECUTE stmt USING @skipCount;
DEALLOCATE PREPARE stmt;


SET @sql_text = CONCAT('INSERT INTO ', @tableNameCopy, ' SELECT * FROM ', @tableName, ' ORDER BY id DESC LIMIT ?');

PREPARE stmt FROM @sql_text;
EXECUTE stmt USING @skipCount;
DEALLOCATE PREPARE stmt;

# Переименовываем таблицы, замещая старую таблицу новой.
SET @sql_text = CONCAT('RENAME TABLE ', @tableName, ' TO ', @tableNameOld, ', ', @tableNameCopy, ' TO ', @tableName);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

# Удаляем старую таблицу.
SET @sql_text = CONCAT('DROP TABLE ', @tableNameOld);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END //
DELIMITER ;


пятница, 31 октября 2014 г.

Копирование БД Postgres

#!/bin/sh
# Этот скрипт копирует БД mycooldb на локальный хост разработчика.
#------------------------------------ 
 
# определяем IP машины, с которой подключился пользователь "cooluser"
vmhost=`netstat -tapen | grep "sshd: cooluser" | head -n1 | awk '{split($5, a, ":"); print a[1]}'`
savebase="/home/cooluser"
dumpname="temp_postgres.dump"
savepath=$savebase"/"$dumpname
#------------------------------------ 
 
# Сохраняем полный дамп базы "mycooldb".
sudo -u postgres pg_dump -Fc -C -c mycooldb > $savepath
# Восстанавливаем базу на локальном хосте разработчика.
# Если база уже существует, удаляем её целиком. Иначе могут быть проблемы с восстановлением.
if psql  -U postgres -h $vmhost -lqt | cut -d \| -f 1 | grep -w 'mycooldb'; then
    dropdb -U postgres -h $vmhost mycooldb
fi
# Создаём пустую базу.
createdb -U postgres -h $vmhost mycooldb
# Заполняем её.
pg_restore -U postgres -h $vmhost --single-transaction --disable-triggers -Fc -d mycooldb $dumpname
# Удаляем временный файл.
rm $savepath

среда, 18 июня 2014 г.

Подчёркивания в приватных методах и свойствах - плохо

Не следует использовать подчёркивания в начале имени для приватных методов и свойств.


$this->_myPrivateMethod($this->_myPrivateVar);

Когда требуется изменить видимость, например, сделать какой-то метод публичным, то приходится изменять его имя во всём коде. Целая куча переименований - следовательно, есть высокая вероятность появления проблем.

Не используя подчёркивания, мы делаем код более защищённым. Да и просто красиво.

суббота, 10 мая 2014 г.

Заменить белый цвет на прозрачность в Photoshop

Понадобилось заменить белый цвет на прозрачность в фотошопе.

Сделать это встроенными средствами фотошопа нереально. Есть десятки способов, но ни один не даёт идеального результата.

Единственный рабочий способ - использование плагина Kill White. Увы, он работает только в старых версиях Photoshop, не в СС. Но хоть так.

воскресенье, 19 января 2014 г.

Книга Рихтера

Оставлю здесь, чтобы не потерять.

Великолепная книга Джеффри Рихтера рассказывает об использовании потоков, семафоров и прочих интересных для программиста вещей. Для программистов C++, разрабатывающих приложения под Windows.

Самое главное, подробно рассказывается, как всё устроено на уровне операционной системы. Что такое "процесс", как процессы взаимодействуют, как обрабатываются исключения, как организована память, и так далее.

Джеффри Рихтер
WINDOWS
ДЛЯ ПРОФЕССИОНАЛОВ
Создание эффективных Win32-приложений
с учетом специфики
64-разрядной версии Windows
(четвёртое издание)

richter-programming-windows.pdf

четверг, 19 декабря 2013 г.

Двойной символ в одинарный с помощью регэкспа

Как разэкранировать строку, которая была экранирована удвоением символа?

Например, в файлах CSV удваивается кавычка (" -> ""), а также само значение обрамляется в кавычки, таким образом строка

My "fat" string!

становится

"My ""fat"" string!"

Чтобы разэкранировать такую строку, требуется заменить удвоенные кавычки на одиночные, а также удалить одиночные.

" ->
"" -> "

Это можно сделать с помощью такого регэкспа:
/"("{0,1})/
заменить совпадение на содержимое круглых скобок.

Пример для PHP:

preg_replace('/"("{0,1})/', '$1', '"My ""fat"" string!"');

воскресенье, 30 октября 2011 г.

Обновление Windows для российской временной зоны

В 2011 президент отменил зимнее время. Тем пользователям Windows, у которых автоматически устанавливаются обновления, напрягаться не нужно: у них уже исправлена временная зона. Остальным придется скачать обновление.

Вот прямые ссылки на файлы:
Windows 7 x64 KB2570791
Windows 7 x86 KB2570791
Windows XP x86 KB2570791