Можно ли смешивать механизмы хранения в одной базе данных?
У меня есть проект OpenCart с около 50000 продуктов в базе данных. Я переключил веб-хостинг с VPS на выделенный сервер, и я увидел некоторые улучшения, но веб-сайт все еще не работает.
На VPS все таблицы были MyISAM
с latin1_swedish_ci
сопоставление на MySQL 5.1.x.x
, На новом сервере я перешел на TokuDB
а также MariaDB 10
, Для некоторых таблиц мне пришлось отбросить индексы FULLTEXT, и я увидел некоторое снижение производительности (все таблицы теперь на TokuDB).
Это разумное решение переключить некоторые таблицы обратно на MyISAM (просто использовать индексы FULLTEXT)? OpenCart имеет несколько запросов, соединяющих множество таблиц... если некоторые из них находятся на TokuDB, а некоторые на MyISAM, есть ли штраф? Я ищу только производительность, ресурсы на 2 месте.
Большое спасибо!
2 ответа
Это нормально, если вы знаете, что вы делаете и почему вы это делаете.
Различные движки используют память и дисковое хранилище очень по-разному. Для системы типа OLTP InnoDB обычно более разумный, чем MyISAM (проверяли ли вы конфликт, прежде чем пытаться использовать другой движок?). Но любая память, которую вы добавляете в пул буферов (для повышения производительности InnoDB), больше не доступна для VFS или для буферов сортировки (что помогает производительности MyISAM).
Я действительно изо всех сил пытаюсь представить, как TokuDB имеет какой-либо смысл в качестве субстрата хранения для сайта электронной коммерции. Все дело в ускорении записи для вставок и обновлений, а также в снижении затрат на обслуживание твердотельных накопителей - выбор производительности редко оказывается лучше, чем у других движков.
Я думаю, что это правильно, у меня есть смешанные механизмы хранения в базах данных, и скорость базы данных правильная.
В любом случае, если вы используете opencart с большим количеством продуктов (50000), я рекомендую вам создать индекс для (всех) ваших таблиц, если вы сделаете это, то сможете улучшить свою скорость.
Я сделал следующее:
#Tabla category campo parent_id
CREATE INDEX i_parent_id ON category (parent_id);
#Tabla category_description campo language_id
CREATE INDEX i_category_description ON category_description (language_id);
#Tabla category_path campos path_id y level
CREATE INDEX i_category_path ON category_path (path_id,level);
#Tabla category_to_store campo store_id
CREATE INDEX i_category_to_store ON category_to_store (store_id);
#Tabla manufacturer_to_store campo store_id
CREATE INDEX i_manufacturer_to_store ON manufacturer_to_store (store_id);
#Tabla product campos manufacturer_id, date_added, date_modified
CREATE INDEX i_product ON product (manufacturer_id, date_added, date_modified);
#Tabla product campos model, sku, upc, ean,(como veis donde tengais la referencia etc) y con tipo FULLTEXT (si el campo es de caracteres no de números)
CREATE FULLTEXT INDEX i_product_fulltext ON product (model, sku, upc, ean);
#Tabla product_description campo language_id
CREATE INDEX i_product_description ON product_description (language_id);
#Tabla product_to_category campo category_id
CREATE INDEX i_product_to_category ON product_to_category (category_id);
#Tabla product_to_store campo store_id
CREATE INDEX i_product_to_store ON product_to_store (store_id);
#Tabla setting campo store_id, serialized
CREATE INDEX i_setting ON setting (store_id, serialized);
#Tabla url_alias campo query con tipo FULLTEXT
CREATE FULLTEXT INDEX i_url_alias ON url_alias (query);# 6936 filas afectadas.
#Tabla zone campo country_id
CREATE INDEX i_zone ON zone (country_id);
#Tabla zone campo name y code con tipo FULLTEXT
CREATE FULLTEXT INDEX i_zone_fulltext ON zone (name,code);
Вам придется поставить "префикс" на ваших столах.
Примерно так: http://www.codigojavaoracle.com/desarrollo-web/mejorar-la-velocidad-en-opencart/