2008-09-16 5 views
4

Мне нравится безопасность, последовательность и самоконтроль InnoDB.Как можно безопасно использовать таблицы MyISAM?

Но мне нужна скорость и легкий вес MyISAM.

Как сделать MyISAM менее подверженным коррупции из-за сбоев, плохих данных и т. Д.? Для проверки требуется проверка навсегда (либо CHECK TABLE, либо myisamchk).

Я не прошу обеспечения безопасности транзакций - для этого и предназначен InnoDB. Но мне нужна база данных, которую я могу перезапустить быстрее, чем часы (или дни!) Позже.

UPDATE: Я не спрашиваю, как быстрее загружать данные в таблицы. Я уже бил головой об этом, и решил, что использование таблиц MyISAM для моей LOAD DATA просто намного быстрее. То, что я сейчас нахожу, - , уменьшающее риски использования таблиц MyISAM. То есть, уменьшая вероятность повреждения, увеличивая скорость восстановления.

ответ

0

Вы женаты на MySQL? Postgres является ACID-совместимым (как innoDB) и (когда он хорошо настроен) почти такой же быстрый, как MyISAM.

+0

Да Я женат на MySQL. Спасибо за игру ... – JBB 2008-09-16 19:57:31

3

Предполагаемые преимущества скорости использования MyISAM могут действительно уйти довольно быстро - тот факт, что ему не хватает блокировки на уровне строк, означает, что небольшие обновления могут блокировать большие объемы данных и блокировать запросы. Из-за этого я скептически отношусь к заявленным преимуществам скорости MyISAM: начните делать несколько UPDATE, а запросы в секунду будут танками.

Я думаю, вам лучше спросить: «Как можно ускорить приложения, поддерживаемые InnoDB?» и ответ затем обрабатывает данные кэширования, возможно, на уровне объекта, в облегченных кэшах - стоимость ACID и, скажем, веб-приложений, на самом деле не нужна.

Если UPDATE являются редкими (если они не являются, MyISAM не является хорошим выбором), вы можете даже использовать кеш запросов MySQL.

memcached (http://www.danga.com/memcached/) - очень популярный вариант для кэширования объектов. В зависимости от вашего приложения у вас есть и другие варианты (HTTP-кеши и т. Д.)

+0

Нет, главная проблема заключается в удивительно интенсивном вводе начального импорта данных в таблицу. Время MyISAM: 12 минут. Время InnoDB: 3 часа. После начальной загрузки UPDATE не существует, а INSERT - редки. Не известное решение для неудовлетворительной работы InnoDB. – JBB 2008-09-16 20:01:52

1

Преимущества работы MyISAM в некоторых случаях на самом деле довольно минимальны; вам необходимо сравнить собственное приложение MyISAM vs InnoDB. Использование транзакционного механизма InnoDB исключительно дает другие преимущества.

В моем тестировании InnoDB будет использовать, как правило, на 150% больше места на диске, чем MyISAM - это из-за его структуры блока и отсутствия сжатия индекса.

Если вы можете себе это позволить, просто используйте InnoDB.

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

0

Ваш комментарий:

Нет, главная проблема заключается в удивительно диск ресурсоемких первоначальный импорт данных в таблицу. Время MyISAM: 12 минут. Время InnoDB: 3 часа. После начальной загрузки UPDATE не существует , а INSERT - редки.Не известно Решение проблемы с InnoDB's .

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

0

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

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

Использование репликации, конечно, у вас будет время задержки между операциями чтения и записи

0

Получить хороший ИБП с приличным кондиционирования питания. Работайте на стабильном и избыточном оборудовании.

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

1

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

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

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

1

Пока я согласен с комментариями innodb, я дам решение проблемы с MyISAM.

Хороший способ для предотвращения коррупции и повышения скорости будет использовать MERGE tables

Вы можете использовать 2 или более MyISAM файлов. Обычно для резервного копирования используются старые данные, которые часто не используются, а другие - более новые данные. Затем у вас будет 2 FRM (файлы таблицы MyISAM) на вашем жестком диске, и один из них будет защищен. Обычно вы ставите старые таблицы MyISAM, а затем они вызывающе не будут повреждены, так как они становятся доступными только для чтения.

Этот метод обычно используется для ускорения больших таблиц MyISAM, но вы также можете применить его здесь.

Надеюсь, что помогло вашему вопросу. Хотя я понимаю, что это действительно не помогло Crash-proof MyISAM, это дает некоторую защиту.

 Смежные вопросы

  • Нет связанных вопросов^_^