Должен ли я использовать MyISAM или InnoDB (или что-то еще)? - PullRequest
2 голосов
/ 17 декабря 2010

У меня есть онлайн-игра, основанная на PHP и MySQL (PHP 5.2.9 и MySQL 5.0.91).В последнее время у меня возникают проблемы, когда весь сайт иногда зависает в определенное время, когда я удаляю несколько тысяч строк старых данных в таблицах.У меня также были проблемы, когда происходили странные вещи, когда запросам приходилось ждать, я полагаю, блокировки таблицы, и игра не функционирует должным образом.

Все мои таблицы - MyISAM, и они работают более 900запросов в секунду.Во всей базе данных (~ 150 таблиц) 88% запросов - чтение и только 12% - запись, но некоторые таблицы ближе к 50/50 и имеют много данных, считываемых и записываемых несколько раз в секунду с разных клиентов.(это многопользовательская игра).Эти таблицы также хранят в любом месте от 1 до 5 миллионов строк.

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

Ответы [ 2 ]

8 голосов
/ 17 декабря 2010

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

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

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

Что касается скорости чтения, InnoDB сохраняет свою запись, упорядоченную по первичному ключу, что позволяет намного быстрее извлекать записи, где вы ищете по PK (такие вещи, как SELECT foo FROM bar WHERE id = baz;). MyISAM хранит свои записи более или менее в порядке их добавления в базу данных, что означает, что может быть быстрее, если вы в основном выполняете поиск по дате добавления записей, например, такие как финансовое отслеживание, когда вы может захотеть захватить все транзакции, которые произошли в определенный день.

Википедия подробно описывает основные различия между двумя движками, но достаточно сказать, что в 99% случаев вы, вероятно, захотите использовать InnoDB.

Единственное обстоятельство, о котором я могу подумать, это то, что MyISAM имеет явную победу, если вам нужна поддержка полнотекстового поиска. MyISAM поддерживает FTS, а InnoDB - нет. Даже тогда вам, вероятно, лучше использовать стороннюю систему, такую ​​как Sphinx, а не использовать MyISAM.

1 голос
/ 17 декабря 2010

Если у вас есть какая-либо сложная модель данных, и вы вынуждены использовать MySQL или один из его многочисленных форков, то используйте механизм хранения транзакций, который поддерживает ссылки на внешние ключи.В противном случае вам придется заново изобретать «колеса» целостности данных, и это не весело и подвержено ошибкам (особенно если вы обнаружите, что ваши данные повсюду имеют проблемы с целостностью, и вы упускаете нужную информацию длясоберите все вместе.

Я бы предложил использовать что-то вроде PostgreSQL, если вы в состоянии это сделать, потому что такие функции устойчивости встроены. Вы все равно можете балансировать нагрузку между серверами, если ваше приложение вырастет до такого уровня.объем, который требуется.

...