Таблицы с 30-миллионными записями работают медленно. Оптимизировать MySQL или перейти на mongodb?

0

У меня есть простой mysql db, работающий на одном сервере с двумя таблицами: продуктами и отзывами. таблица продуктов содержит около 10 миллионов записей, а таблица обзоров насчитывает около 30 миллионов записей.

Весь Db составляет около 30 ГБ. Я чувствую, что это замедляется, и мне интересно, что мне с этим делать. Я создал индексы, но это не помогло. Например, таблица продуктов имеет поле категории и когда я делаю простой select * from products where category=2 - он просто медленный.

Переключение на mongodb поможет мне в этой ситуации, или я могу решить это, просто как-то оптимизируя Mysql? В этом случае я должен делать окантовку или размер таблиц не настолько большой, и можно оптимизировать другой способ?

Таблицы и my.cnf

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL auto_increment,
  `product_title` varchar(1000) NOT NULL,
  `product_id` varchar(100) NOT NULL,
  `title` varchar(1000) NOT NULL,
  `image` varchar(1000) NOT NULL,
  `url` varchar(1000) NOT NULL,
  `price` varchar(100) NOT NULL,
  `reviews` int(11) NOT NULL,
  `stars` float NOT NULL,
  `BrowseNodeID` int(11) NOT NULL,
  `status` varchar(100) NOT NULL,
  `started_at` int(15) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id_index` (`BrowseNodeID`),
  KEY `status_index` (`status`),
  KEY `started_index` (`started_at`),
  KEY `id_ind` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13743335 ;


CREATE TABLE IF NOT EXISTS `reviews` (
  `id` int(11) NOT NULL auto_increment,
  `product_id` varchar(100) NOT NULL,
  `product_title` varchar(1000) NOT NULL,
  `review_title` varchar(1000) NOT NULL,
  `content` varchar(5000) NOT NULL,
  `author` varchar(255) NOT NULL,
  `author_profile` varchar(1000) NOT NULL,
  `stars` float NOT NULL,
  `owner` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `product_id` (`product_id`),
  KEY `id_index` (`product_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=48129737 ;

Некоторая информация из my.cnf

set-variable    = query_cache_size=1512M
set-variable    = thread_cache_size=8
thread_concurrency = 8
skip-innodb
low-priority-updates
delay-key-write=ALL

key_buffer_size = 100M
max_allowed_packet = 1M
#table_open_cache = 4048
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 50M
set-variable    = table_cache=256
set-variable    = query_cache_limit=1024M
set-variable    = query_cache_size=1024M
  • 0
    Можете ли вы предоставить свой my.cnf и определение таблицы?
  • 3
    Что такое "медленный"? Никаких подробностей о задействованных таблицах, индексах или запросах / запросах - больше похоже на то, что вы хотите оправдать переход на mongodb.
Показать ещё 5 комментариев
Теги:
database
scalability

1 ответ

3

Основываясь на вашем my.cnf, похоже, что ваш key_buffer_size слишком мал, поэтому вы отправляетесь на диск для каждого чтения. В идеале это значение должно быть больше, чем общий размер ваших индексов MyISAM.

Прежде чем перейти на смену технологий БД, вы также можете рассмотреть возможность изменения типа таблицы в InnoDB. Теперь ваш my.cnf отключен. Я получил отличную звездную производительность из таблицы строк 300M со смарт-индексами и достаточной памятью. InnoDB также даст вам некоторую свободу действий с более длинными работающими чтениями, поскольку они не будут блокировать всю вашу таблицу.

  • 0
    Спасибо вам за ваш совет. 300M? Это поразительно! Все на одном сервере и в одной таблице? Нет шардинга? Сколько у вас оперативной памяти? Удалось ли вам сделать простые запросы с помощью ГДЕ или заказа?
  • 1
    @Arty - stackoverflow.com/questions/4419499/… (мой рабочий стол)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню