оптимизировать базу данных mysql - myISAM db - PullRequest
0 голосов
/ 29 сентября 2010

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

1) Каков разумный способ решить проблему, когда при УСТАНОВКЕ или ОБНОВЛЕНИИ нескольких строк в одной таблице многие запросы SELECT зависают.

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

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

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

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

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

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

  • Если я добавлю поле «view» в другой TABLE, я все равно получу эту проблему, потому что при отображении сообщения на веб-сайте мне все еще нужен номер представления для этого сообщения с использованием внутреннего запроса на соединение. И этот запрос все еще застрял, если запустить запрос представления обновления.

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

Ответы [ 2 ]

0 голосов
/ 01 октября 2010

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

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

0 голосов
/ 29 сентября 2010

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

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

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

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

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

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

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

...