Оптимизация базы данных MySQL для большой таблицы с частыми записями и полнотекстовыми столбцами - PullRequest
1 голос
/ 13 ноября 2011

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

Основная проблема, с которой мы сталкиваемся, заключается в том, что пользователь «сохраняет» элемент, вызывая запрос на обновление, в то время как другие пользователи также выполняют поиск по существующим индексам FULLTEXT:

UPDATE product SET listed = listed+1 WHERE product_id = XX

Например, я только что запустил обновление за 0,01 секунды, другие запросы не выполнялись, а несколько минут назад, когда также выполнялся большой запрос FULLTEXT, этот же запрос занял 23 секунды.

Я предполагаю, что это потому, что таблица MYISAM и не может делать блокировки на уровне строк.

Наша таблица продуктов содержит более 3,5 миллионов записей и удвоится к концу месяца. После этого он должен выровняться до 2-5% ежемесячного увеличения.

CREATE TABLE product (
    product_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    category_id INT UNSIGNED NOT NULL DEFAULT '0',
    title VARCHAR (100) NOT NULL DEFAULT '',
    short_desc VARCHAR (255) NOT NULL DEFAULT '',
    description TEXT NOT NULL,
    msrp DECIMAL (6,2) NOT NULL DEFAULT '000.00',
    rating DECIMAL(3,2) NOT NULL DEFAULT '0.0',
    reviews INT UNSIGNED NOT NULL DEFAULT '0',
    listed INT UNSIGNED NOT NULL DEFAULT '0',
    sku VARCHAR(75) NOT NULL DEFAULT '0',
    upc VARCHAR(20) NOT NULL DEFAULT '0',
    updateddate DATETIME NOT NULL,
    PRIMARY KEY (product_id),
    KEY title (title),
    KEY category_id (category_id),  
    KEY listed (listed),
    KEY mfrg_id (mfrg_id),
    KEY identifier (identifier),
    FULLTEXT INDEX (title),
    FULLTEXT INDEX (description)
) ENGINE = MYISAM;

База данных работает на выделенном сервере, на котором размещается только наш сайт. Мы планируем перевести базу данных в структуру репликации с сервером Dual Proc, 16 ГБ ОЗУ для поля запроса [ведомый] и текущим веб-сервером, обрабатывающим записи [dual proc, 4 ГБ ОЗУ].

Я не эксперт по БД [ясно], и из-за исследований стали бояться запускать InnoDB одновременно с MYISAM [последствия репликации и резервного копирования?], Но похоже, что разделение таблицы продуктов содержит главную информацию [innodb] и полнотекстовые описания [myisam] могут помочь значительно?

Если у вас есть идея и вам нужна дополнительная информация, пожалуйста, прокомментируйте, и я предоставлю более подробную информацию.

Спасибо

1 Ответ

1 голос
/ 13 ноября 2011

Ты точно о MyIsam.Это блокировка таблицы вместо блокировки строк, как innoDB.

Итак, из того, что вы говорите, запрос (полный текст) занимает много времени, поэтому обновление нужно подождать, прежде чем оно будет сделано.

Вам действительно стоит подумать о том, чтобы переключиться на innoDB (простое решение) или переключить свой полнотекстовый поиск на другое, например, solr, эластичный поиск, сфинкс.

Кроме того, вам следует проверить журнал slow_query и оптимизировать все этизапрос.

...