База данных Drupal innodb или MyISAM?

10

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

Как я могу определить, является ли моя база данных MySQL InnoDB или MyISAM?

chrisjlee
источник
1
Тип таблицы не привязан к каталогу. Вы можете иметь каталог со смесью таблиц MyISAM и InnoDB.
mpdonadio
2
Несмотря на преимущества оптимизации на этом уровне, я сомневаюсь, что изменение типов таблиц решит ваши проблемы с производительностью. Разница не такая уж большая.
Летарион
1
@ Крис Дж. Ли, это правильно. Смешанные типы таблиц могут использоваться для повышения производительности или для использования функций, доступных только для определенного типа таблиц (например, поиск FULLTEXT с таблицами MyISAM). Это также может произойти случайно, если вы измените значения по умолчанию в mysqld и создадите больше таблиц в каталоге :)
mpdonadio
2
Летарион: это просто неправильно. Типы таблиц и способ настройки mysql для них оказывают огромное влияние на производительность!
Уолтер Хек
2
@Letharion: Фактически, оставляя в стороне архитектурные улучшения, очень большой прирост производительности в случае таких вещей, как параллелизм со смешанными SELECT и UPDATE - UPDATE блокирует таблицу в MyISAM, но только строку в InnoDB - означает, что значительное увеличение производительности может быть замеченным только с изменением двигателя стола. Теперь, если вы делаете глупый запрос, то вы делаете глупый запрос, и изменение типов таблиц не поможет. Но отмахиваться от смены двигателей из-под контроля в равной степени некорректно.
BMDan

Ответы:

8

Вы можете запустить собственный запрос:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

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

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

Лично я бы порекомендовал Navicat для MySQL , это очень приятный графический интерфейс MySQL, который позволяет легко находить подобные вещи.

Источник: http://www.electrictoolbox.com/mysql-table-storage-engine/

Клайв
источник
Старый инструмент MySQL Administrator также хорошо работает для подобных вещей. Если вы покопаетесь на сайте MySQL, вы все равно сможете найти установщик.
mpdonadio
@MPD Wow это все еще происходит? Должен загрузить это, даже если только для некоторой ностальгии :)
Клайв
Администратор и Query Browser официально устарели и не поддерживаются, но вы все равно можете их скачать. Я ненавижу Workbench, и до сих пор использую их.
mpdonadio
Чтобы увидеть вывод, похожий на то, что вы видели в phpMyAdmin в командной строке, используйте SHOW TABLE STATUS. Чтобы получить простой подсчет количества таблиц в каждом типе двигателя, это SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan
6

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

(Изменить: см. Комментарий Клайвса ниже)

Есть также последствия для вашей настройки MySQL, в зависимости от того, какую БД вы используете. Если у вас есть доступ к серверу, mysqltuner должен быть вашим первым шагом, чтобы проверить конфигурацию:

https://github.com/rackerhacker/MySQLTuner-perl#readme

Мартин
источник
2
+1 я не знаю , InnoDB был медленным для COUNTзапросов, согласно этой статье бывшего менеджеру High Performance Group для MySQL , хотя это только действительно влияет на запрос , содержащий COUNT(*) без в WHEREп.
Клайв
3
Причина заключается в том, что MyISAM поддерживает значение для каждой таблицы для числа строк в таблице, что означает, что простой SELECT COUNT(*) FROM tableможет мгновенно вернуться с этим значением. InnoDB этого не делает, поэтому он должен сканировать весь индекс первичного ключа. Тем не менее, хотя Drupal делает много SELECT COUNT(*), я могу думать только об одном месте во всем коде, которое делает это без WHEREпредложения. Таким образом, не используйте MyISAM из-за этой конкретной проблемы. InnoDB с буферным пулом приличного размера будет быстрее для всех реальных запросов.
BMDan
6

Просто пытаться сделать сайт быстрее, это все равно что слепо менять машину и надеяться, что в следующий раз ты получишь скорость быстрее.

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

  1. Включили ли вы встроенные механизмы: кэширование страниц (действует только для анонимных пользователей), агрегация CSS и JS?
  2. Если ваш хост предлагает кэш кода операции, такой как APC, включите его.
  3. Настройте свой Drupal локально, включая полную БД.
  4. Убедитесь, что у вас запущен XDebug.
  5. Начните делать реальное профилирование производительности. Таким образом, вы можете определить, какая часть вашего сайта занимает много времени. Чем медленнее ваш сайт, тем легче найти виновный код / ​​компонент.

Часто это просто медленный запрос к БД, для которого нужен индекс, или модуль, выполняющий работу медленно.

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

BetaRide
источник
5

FWIW наш почти 20К узел Drupal 6.x испытывал некоторые проблемы с производительностью, и я решил перенести все таблицы в InnoDB. Это было легко, и способ, которым я справился, заключался в том, чтобы использовать mysqldump для выгрузки всего содержимого в файл sql, использовать редактор (sed), чтобы заменить все вхождения MyISAM в InnoDB, а затем перезагрузить базу данных из этого файла. Одним из недостатков является то, что вы не можете восстановить пространство из базы данных InnoDB (IIRC), но пока вы храните дубликаты таблиц в отдельной БД, у вас не должно возникнуть проблем. Да, и мы увидели значительное увеличение производительности. И поскольку у нас есть четыре экземпляра Drupal, огромное количество файлов таблиц было исключено из файловой системы (да, они содержатся внутри самого файла InnoDB). Это моя $ .02 стоит.

bobmct
источник
2
Наличие единого табличного пространства InnoDB может сэкономить ваши inode, но (как вы сами упомянули) за счет дискового пространства. Даже если вы удалите много данных, вы не сможете освободить это дисковое пространство. Это также приводит к ненужным большим файлам резервных копий и невозможности восстановления отдельных таблиц. Вот почему я предпочитаю использовать эту innodb_file_per_tableопцию.
Geewiz
1
Кроме того , вы можете преобразовать таблицы в месте: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Добавьте соответствующие опции ( -uroot -psomepassнапример) к двум mysqls при необходимости.
BMDan
5

Просто один на один. Если вы используете Drupal 6, вы можете установить модуль DBTuner ; он может легко перемещать ваши таблицы из MyISAM в InnoDB. Так что да, есть модуль для этого!

mikeytown2
источник