Drupal база даних innodb або MyISAM?


10

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

Як я можу дізнатися, чи є моя база даних MySQL InnoDB чи MyISAM?


1
Тип таблиці не прив’язаний до каталогу. Ви можете мати каталог із сумішшю таблиць MyISAM та InnoDB.
mpdonadio

2
Хоча є оптимізація на цьому рівні, я дуже сумніваюся, що зміна типів таблиць виправить ваші проблеми з продуктивністю. Різниця просто не така велика.
Летаріон

1
@Chris J. Lee, це правильно. Типи змішування таблиць можна використовувати з міркувань продуктивності або використовувати функції, доступні лише для певного типу таблиці (наприклад, пошук FULLTEXT w / MyISAM таблиць). Це також може трапитися випадково, якщо ви зміните параметри mysqld за замовчуванням та створите більше таблиць у каталозі :)
mpdonadio

2
Летаріон: це просто невірно. Типи таблиць та спосіб налаштування mysql для них мають величезний вплив на продуктивність!
Вальтер Хек

2
@Letharion: Насправді, залишаючи осторонь архітектурних удосконалень, дуже великі підвищення продуктивності у випадку таких речей, як паралельність із змішаними SELECTs та UPDATE - UPDATE заблокує таблицю в MyISAM, але лише рядок в InnoDB - означає, що величезні показники підвищення продуктивності можуть не бачити нічого, крім зміни двигуна столу. Тепер, якщо ви робите нерозумний запит, ви робите дурний запит, а зміна типів таблиці не допоможе. Але відмовлятись від зміни двигунів з-під руки - це так само неправильно.
BMDan

Відповіді:


8

Ви можете запустити спеціальний запит:

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

перерахувати всі таблиці у вашій базі даних та двигун, який використовується для кожної.

Крім того, ви можете увійти у свою базу даних за допомогою phpMyAdmin і вибрати свою базу даних ... ви побачите двигун у Typeстовпці у списку таблиць.

Особисто я б рекомендував Navicat для MySQL , це дуже приємний MySQL GUI і дозволяє дізнатися подібні речі дуже просто.

Джерело: http://www.electrictoolbox.com/mysql-table-storage-engine/


Старий інструмент адміністратора MySQL також добре працює для таких речей. Якщо ти заглянеш на веб-сайт MySQL, ти все ще можеш знайти інсталятора.
mpdonadio

@MPD Вау, це все ще відбувається? Потрібно завантажити це, навіть якщо лише трохи ностальгії :)
Клайв

Адміністратор та браузер запитів зараз офіційно застаріли та не підтримуються, але ви все одно можете завантажити їх. Я ненавиджу 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. Почніть займатися реальним профілем продуктивності. Таким чином ви зможете визначити, яка частина вашого веб-сайту забирає багато часу. Чим повільніше ваш веб-сайт, тим простіше знайти код / ​​компонент вини.

Часто це просто повільний запит БД, який потребує індексу, або модуль, який робить все повільно.

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


5

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


2
Наявність єдиного простору таблиць InnoDB може заощадити ваші вставки, але (як ви вже згадуєте про себе) за рахунок місця на диску. Навіть якщо ви видалите багато даних, ви не зможете повернути це місце на диску. Це також призводить до непотрібних великих резервних файлів і неможливості відновлення окремих таблиць. Ось чому я вважаю за краще використовувати 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. Так що так, для цього є модуль!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.