Настройка производительности базы данных Drupal - переключение определенных таблиц на InnoDB из MyISAM - PullRequest
0 голосов
/ 14 июня 2011

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

В настоящее время я считаю, что ВСЕ наши таблицы drupal - это MyISAM.Я рассматривал возможность переключения таблиц с интенсивной записью:

  1. узел
  2. сторожевой таймер
  3. сессий
  4. accesslog
  5. Какие другие таблицы будутвы считаете?

InnoDB.

Как вы думаете, это хорошая идея?Могу ли я увидеть прирост производительности?Причина, по которой я рассматриваю это как часть общего решения, заключается в том, что при импорте mysqld часто исчерпывает память и отключает всю систему.Это происходит ТОЛЬКО при импорте.

Я в конечном итоге увижу такие вещи:

xml import at [01/Jun/2011:13:26:38 -0400] "GET /import/xml_import HTTP/1.1" 200
....
14:02:38 [ERROR] /usr/libexec/mysqld: Out of memory (Needed 1049152 bytes)

Поле x32, поэтому мы ограничены объемом памяти, который мы можем выделить для mySql.У нас также есть PHP, JAVA, SVN и другие, работающие на этой коробке ... она облагается налогом как есть.хех.

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

TIA.

РЕДАКТИРОВАТЬ: (I 'я включил мой текущий my.cnf):


[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
tmpdir=/var/lib/mysql/tmp
#old_passwords=1
skip-locking
key_buffer = 2048M #doubled from 1024
max_allowed_packet = 16M
table_cache = 5000
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 64 #doubled from 32
thread_concurrency = 8
query_cache_size = 1024M #doubled from 512
tmp_table_size=1024M
max_heap_table_size=1024M
back_log = 100
max_connect_errors = 10000
join_buffer_size=1M
open-files = 20000

interactive_timeout = 600
wait_timeout = 600

ft_min_word_len=3
ft_stopword_file=''
max_connections=1000

#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
#innodb_log_file_size = 100M

#innodb_buffer_pool_size = 384M
#innodb_additional_mem_pool_size = 20M


#log-slow-queries=/var/lib/mysqllogs/slow-log
#long_query_time=2   
#log-queries-not-using-indexes

#log-bin=/var/lib/mysqllogs/bin-log
#log-slave-updates
#expire_logs_days = 14
server-id       = 1 

[mysql.server]
user=mysql
#basedir=/var/lib  

[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit=65536

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Если вы точно знаете, что веб-сайт будет подвергаться малому количеству трафика, непременно оставайтесь в MyISAM.

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

REASON # 1 : InnoDB выполняет блокировку на уровне строк.Что касается MyISAM, любой выполненный запрос INSERT, UPDATE или DELETE вызовет полную блокировку таблицы.Даже на веб-сайте с низким трафиком существует возможность двух или более соединений с БД, блокирующих одну и ту же таблицу.С InnoDB эта возможность полностью исключена.

REASON # 2 : InnoDB кэширует данные и индексы.MyISAM кэширует только индексные страницы.

Кэш ключей (измеренный в key_buffer_size) содержит страницы индекса для таблиц MyISAM.Всегда есть дисковый ввод / вывод для чтения данных из MyISAM.При первом чтении записи будут кэшированы индексные страницы, используемые для поиска строки в кэше ключей.Последующие поиски найдут ключ, необходимый в кеше ключей, но всегда будет обязательный дисковый ввод-вывод для получения данных.С InnoDB обе страницы данных и индекса находятся в пуле буферов InnoDB (размер innodb_buffer_pool_size).Дисковый ввод-вывод значительно сокращается благодаря всему, что кэшируется в пуле буферов.

Я всегда рекомендовал базы данных Drupal, использующие InnoDB вместо MyISAM. На самом деле легко конвертировать, используя прямой MySQL .

До этого MyISAM - это вся необходимая огневая мощь, , особенно на серверах со скромной оперативной памятью .

1 голос
/ 14 июня 2011

Вообще говоря, InnoDB медленнее, чем MyISAM, поскольку InnoDB является атомарным, а MyISAM - нет. С компромиссом производительности вы получаете надежность данных.

Если вы можете отключить индексы перед импортом, вы увидите увеличение производительности. Более эффективно перестраивать индексы сразу, а не для каждой вставки.

Вы не хотите настраивать mysql для превышения доступной памяти. Настройки памяти распределены по нескольким параметрам. Вы можете использовать что-то вроде этого http://mysqltuner.pl/mysqltuner.pl, чтобы определить, насколько хорошо настроена ваша установка mysql.

...