Рубрика «MySQL»

Sypex Dumper — быстрый и удобный бекап

Наткнулся в Сети на очень интересный скрипт для резервного копирования базы данных - ниже приводится его описание с официального сайта.

Изначально Sypex Dumper создавался для работы с большими базами данных (сотня мегабайт для него не проблема), при этом он должен был быть максимально быстрым, компактным и удобным.

Основные возможности

  • создание резервной копии и восстановление базы данных MySQL без использования сторонних программ, таких как mysqldump;
  • работа с базами данных любых размеров (от нескольких килобайт до сотен мегабайт), в связи с этим вся работа с файлами бекапа осуществляется по FTP, но download возможен и с помощью менеджера загрузки (Download Master, Reget и др.);
  • поддержка двух форматов сжатия файлов (Gzip и Bzip2), а также разной степени сжатия;
  • поддержка фильтров для таблиц, с их помощью легко можно выбрать нужные таблицы;
  • работает на Windows и Linux;
  • высокая скорость работы (в 2 раза быстрее, чем phpMyAdmin);
  • оригинальный алгоритм парсинга дампов благодаря которому дампер обгоняет даже некоторые windows-приложения, не говоря уже о скриптах (в 4 раза быстрее, чем phpMyAdmin);
  • индикатор выполнения задачи, благодаря чему всегда видно на каком этапе работы находится срипт;
  • очень компактный (всего 25 КБ);
  • легко настраивается;
  • сохраняются последние настройки, что удобно при частом использовании;
  • имеется собственная система авторизации, несколько вариантов авторизации, в том числе пользовательская;
  • небольшой расход памяти при работе;
  • совместимость с дампами phpMyAdmin и mysqldump;

История создания

Началась, наша история, когда база данных одного сайта всё сильнее разрасталась, и размеры её перевалили за 10 МБ, а глубокоуважаемый phpMyAdmin вместо столь желанного дампа начал выдавать пустые страницы либо ошибки. Естественно phpMyAdmin многократно мысленно проклинался, но делу это не помогло. Тогда начались поиски альтернативного софта, но ничего достойного внимания найдено не было.

Что делать? Пришлось заняться созданием своей утилиты для резервного копирования и восстановления базы данных MySQL. А далее дело техники…

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

Полнотекстовой поиск в MySQL

Полнотекстовой поиск в MySQL на сегодняшний день поддерживается только для таблиц типа MyISAM и только для текстовых столбцов переменной длины (TEXT и VARCHAR). Эта возможность активируется созданием индекса FULLTEXT для столбцов, по которым необходимо осуществлять поиск.

Полнотекстовой поиск в MySQL не чувствителен к регистру. Кроме того, при поиске игнорируются так называемые “общеупотребительные” слова. К ним относятся слишком короткие слова (по умолчанию состоящие меньше, чем из четырех символов), а также слова, встречающиеся, по крайней мере, в половине записей. Так если в таблице имеются только две записи, то поиск не даст результатов, поскольку каждое слово будет присутствовать в половине записей.

Для использования возможности полнотекстового поиска в таблице, содержащей текстовые поля, необходимо создать индексы FULLTEXT. Изменить уже существующие таблицы можно при помощи оператора ALTER:

ALTER TABLE mytable ADD FULLTEXT name (name);

Здесь сразу после ключевого слова FULLTEXT следует имя создаваемого индекса, за которым в скобках указано имя текстового столбца.

Индекс FULLTEXT можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую:

ALTER TABLE mytable ADD FULLTEXT name (name, description);

Если индекс создается только по одному столбцу и его имя совпадает с именем столбца, то имя индекса, размещенного после ключевого слова FULLTEXT, можно опустить.

На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов:

ALTER TABLE mytable ADD FULLTEXT (name),
                    ADD FULLTEXT (description),
                    ADD FULLTEXT together (name, description);

Поиск выполняется при помощи встроенной функции MATCH(), в качестве аргумента которой выступает один или более индексов типа FULLTEXT, а также функции AGAINST(), которая принимает в качестве аргумента искомую строку:

SELECT * FROM mytable WHERE MATCH(name) AGAINST('программирование');

Здесь из таблицы mytable извлекаются все записи, поле name которых содержит слово “программирование”. Синтаксис допускает использование нескольких конструкций MATCH() - AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND:

SELECT * FROM mytable WHERE MATCH(together) AGAINST('программирование')
                         OR MATCH(together) AGAINST('кодирование');

Здесь из таблицы mytable извлекаются все записи, поля name или description которых содержат либо слово “программирование”, либо слово “кодирование”.

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

Начиная с версии 4.0.1 MySQL поддерживает поиск в так называемом логическом режиме, позволяющем задать обязательное отсутствие слова в результатах запроса, изменять величину релевантности для отдельных слов и многое другое.

Ссылки по теме:

Удаление и выборка нескольких записей

В web-программировании, особенно при создании различных панелей администрирования, часто встает задача множественного выбора или удаления сразу нескольких записей из базы данных. Пусть имеется таблица items, содержащая два поля: первичный ключ таблицы id и текстовое поле title.

Для удаления записей обычно создается HTML-форма с набором флажков:

<input type="checkbox" name="item[]" value="5" /><br/>
<input type="checkbox" name="item[]" value="7" /><br/>
<input type="checkbox" name="item[]" value="12" /><br/>
<input type="checkbox" name="item[]" value="25" /><br/>
<input type="checkbox" name="item[]" value="32" /><br/>

Скрипт, формирующий список элементов input формы, и удаляющий выбранные записи может выглядеть так:

<?php
echo '<h2>Список</h2>';
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
$query = "SELECT id, title FROM items WHERE 1";
$res = mysql_query( $query );
echo '<table border="1">';;
echo '<tr><th>ID</th><th>Наименование</th><th>Удл.</th></tr>';
while ( $item = mysql_fetch_array( $res ) )
{
  echo '<tr>';
  echo '<td>'.$item['id'].'</td>';
  echo '<td>'.$item['title'].'</td>';
  echo '<td><input type="checkbox" name="item[]" value="'.$item['id'].'" /></td>'
  echo '</tr>';
}
echo '</table>';
echo '<input type="submit" name="submitForm" value="Удалить отмеченные" />';
echo '</form>';

if ( isset ( $_POST['item'] ) )
{
  $ids = implode( ',', $_POST['item'] );
  $query = 'DELETE FROM items WHERE id IN ('.$ids.')';
  mysql_query( $query );
  header( 'Location: '.$_SERVER['PHP_SELF'] );
}
?>

Массив $_POST['item'] содержит ID всех отмеченных checkbox-ов (не отмеченные на сервер не передаются). Запрос к БД на удаление выглядит так

DELETE FROM items WHERE id IN (6,9,11,12);

Если стоит задача не удаления записей, а их выборки, то вместо оператора DELETE следует использовать оператор SELECT.