Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Использую одну из популярных CMS.
В ней условно можно разделить все таблицы на два типа:
1. для контента MyISAM
2. для кэша InnoDB
Вопрос в следующем.
Раньше у меня не было поддержки на хостинге InnoDB - и соответственно таблицы для кэша были MyISAM.
Сайт работал быстро (скорость показа не закэшированной страницы, и скорость показа закэшированной страницы).
Сейчас появилась поддержа InnoDB.
И соответственно таблицы для кэша перевелись на нее.
И сайт стал работать заметно медленнее (на секунды...! - даже бы сказал, что было 1 секунда, а стало и бывало - 7-40 секунд).
По умолчанию в данной CMS - таблицы для кэша ставяться как InnoDB.
Если с ним (InnoDB) - сайт работает медленнее - зачем он этот InnoDB - нужен и стоит ли мне его оставлять?
Спасибо.
Отредактированно Slorvengo (15.01.2014 13:06:37)
Неактивен
В принципе преимущества InnoDB - мне стали понятны после прочтения некоторых статей...
Что с ним можно одновременно и читать и писать данные.
В то время как MyISM - блокирует таблицу, пока пишет (так понимаю что это всегда по умолчанию).
Соответственно тот, кто пока пишет - "просит" подождать всех остальных.
Но почему он так медленно работает?
Отредактированно Slorvengo (15.01.2014 14:00:13)
Неактивен
Прям как донесение разведчика - никаких точных данных. Например, "одну из популярных CMS" - какую?
Если ткнуть пальцем в небо, то предположу, что настройки для иннобд дефолтные.
Для начала покажите лог медленных запросов и содержимое конфиг файла my.cnf
Неактивен
Вопрос в том какие у вас запросы идут к этим таблицам? Так как Innodb работает транзакционно и для этого поддерживает мультиверсионность (множественные версии каждой из строк), то одиночная операция на ненагруженном сервере будем немного медленнее, чем для MyISAM (это правда не будет описываться словами "так тормозит", поэтому кажется, дело не в этом). Еще бывают операции, которые на InnoDB выполняются медленно опять же из-за требования мультиверсионности, а на MyISAM мгновенны (например, SELECT count(*) FROM my_table).
Неактивен
my.cnf
# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
#
# MySQL programs look for option files in a set of
# locations which depend on the deployment platform.
# You can copy this option file to one of those
# locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (using the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
server-id = 1
# Uncomment the following if you want to log updates
#log-bin=mysql-bin
# binary logging format - mixed recommended
#binlog_format=mixed
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[mysqlhotcopy]
interactive-timeout
Неактивен
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
Неактивен
vasya написал:
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
Т.е. мне просто надо все это расскомментировать?
И перезапустить?
Неактивен
Ну не прямо раскомментировать. Там есть текстовые комментарии, которые поясняют. Например, переменную innodb_buffer_pool_size стоит сделать побольше, можно 1 Гб. Но вы не пояснили в чем конкретно проблема, какие запросы и в чем их медленность.
Неактивен
Выполняются медленно - обычные запросы INSERT
Вот в такие таблицы
#
# TABLE STRUCTURE FOR TABLE 'cacheTable'
#
CREATE TABLE cacheTable (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
identifier VARCHAR(250) DEFAULT '' NOT NULL,
crdate INT(11) UNSIGNED DEFAULT '0' NOT NULL,
content mediumblob,
lifetime INT(11) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (id),
KEY cache_id (identifier)
) ENGINE=InnoDB;
Неактивен
innodb_flush_log_at_trx_commit=0
и увеличьте buffer_pool и log_buffer
Неактивен
insert по 40сек ?
Неактивен
Сколько строк вставляет INSERT и какой объем контента в каждой?
Неактивен
vasya написал:
insert по 40сек ?
7-40 секунд.
rgbeast написал:
Сколько строк вставляет INSERT и какой объем контента в каждой?
Первый раз при вызове страницы - что - бы не соврать - вставок в таблицы для кэша - может быть 100-150, а то и больше.
Про объем контента - думаю, что 80% - это страница как есть. Все остальное это служебное . Так может быть содержимое PHP-массива, адрес ЧПУ - т.е. не очень большое.
Отредактированно Slorvengo (17.01.2014 21:29:50)
Неактивен
Тогда очень странно 7-40 секунд. Попробуйте в это время выполнить SHOW FULL PROCESSLIST;
Неактивен
rgbeast написал:
Тогда очень странно 7-40 секунд. Попробуйте в это время выполнить SHOW FULL PROCESSLIST;
Еще не разкомментировал строки.
Неактивен
rgbeast написал:
Тогда очень странно 7-40 секунд. Попробуйте в это время выполнить SHOW FULL PROCESSLIST;
Сменил на InnoDB - как сказано .....
Все отлично работает - и даже бы сказал, что лучше -
чуточку быстрее работает SELECT чем MyISAM...
И как-он лучше держит - когда например есть посещения на сайте...
Как-то более и не заметно, что сайт , кто-то посещает (кроме тебя) - странички быстро открываются.
В то время как с MyISAM - при посещениях - сайт мог долго думать!
Единственное вставка Insert - чуть-чуть медленнее идет (но это не заметно).
А самое главное - как и должно быть - InnoDB!
Спасибо.
Отредактированно Slorvengo (20.01.2014 21:29:36)
Неактивен