оптимизировать базу данных mysql - myISAM db

У меня есть два вопроса о производительности msyql с моей базой данных с использованием движка MyISAM:

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

2) Легко ли перейти с MyISAM на InnoDB с работающей базой данных?

3) Почему myISAM по-прежнему является опцией mySQL по умолчанию, когда InnoDB хорош тем, что обеспечивает блокировку на уровне строк?

4) У меня есть одна проблема при разработке базы данных с просмотром сообщения, как показано ниже:

  • У меня в одной таблице много "постов".

  • Я хочу дать одному «сообщению» число просмотров, и оно будет увеличиваться каждый раз, когда люди просматривают сообщение на веб-сайте.

  • Итак, если я помещу поле «просмотр» в таблицу «Сообщения», это будет запускать запрос «Обновить сообщения, установленный вид = вид + 1» каждый раз, когда посетитель посещает этот пост. Это заставляет другой запрос выбора в этой строке зависать.

  • Если я помещу поле «представление» в другую ТАБЛИЦУ, я все равно столкнусь с этой проблемой, потому что, когда я отображаю сообщение на веб-сайте, мне все еще нужен номер просмотра для этого сообщения с помощью внутреннего запроса соединения. И этот запрос все еще зависает, если выполняется запрос на обновление представления.

Извините за мой плохой английский.


person lamtheo.com    schedule 29.09.2010    source источник


Ответы (2)


Вы уже знаете ответы почти на все ваши вопросы, переключитесь на InnoDB

Сначала проверьте, есть ли у вас поддержка InnoDB. На вашем сервере mysql выполните следующий запрос:

ПОКАЗАТЬ ПЕРЕМЕННЫЕ, КАК 'have_innodb';

если вы получите значение «ДА», вы можете изменить каждую таблицу, которую хотите изменить, с помощью следующего SQL-запроса:

ALTER TABLE [имя таблицы] ENGINE=InnoDB;

(сначала сделайте резервную копию)

В будущих выпусках MySQL переключится на InnoDB в качестве механизма хранения по умолчанию. Но из-за устаревшей настройки это не было изменено

person Cecil Zorg    schedule 29.09.2010
comment
проблема в том, что моя БД сейчас слишком большая, не быстро сделать бэкап. Как насчет того, чтобы использовать и myISAM, и InnoDB, или использовать что-то вроде Delayed и Low Priority? - person lamtheo.com; 29.09.2010
comment
Вы можете использовать таблицы разных типов в одной базе данных, поэтому сочетание MyISAM и InnoDB действительно работает. Конечно, вы получаете преимущества innodb только для таблиц innodb. - person Jaydee; 30.09.2010

Предложение Jaydee о сочетании MyISAM и InnoDB является хорошим. Вы можете сделать таблицу «представления» таблицей InnoDB, и она не должна блокировать чтение во время записи.

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

person Joshua Martell    schedule 01.10.2010