Нужен совет, Большая база товаров, сортировка

ischuplev

Новичок
Есть таблица товаров, в ней 1,699,196 записей (MyISAM)
Есть дерево разделов, и дерево групп - это 2 разные таблицы

Нужно сделать выборку, выбрать товары из раздела 1 и группы 1 и отсортировать по цене.
Я сделал дополнительную таблицу, чтобы не JOIN-ить где храню несколько записей по 1 товару, например, есть товар находиться в
разделе 1 (id:1)
- подразделе 1 (id:2) (-тут)
и в группе:
группа 1 (id:1)
- группа 2 (id:2) (-тут)

то получается запись:
Код:
id_товара|id_раздела|id_группы|active|price  |
1        |1         |1        |yes   |1000.00|
1        |2         |1        |yes   |1000.00|
1        |1         |2        |yes   |1000.00|
1        |2         |2        |yes   |1000.00|
ну и т.д.
сама таблица, сейчас в ней 15,023,616 записей:

Код:
CREATE TABLE IF NOT EXISTS `table` (
  `section_id` int(15) NOT NULL,
  `group_id` int(15) NOT NULL,
  `catalog_id` int(15) NOT NULL,
  `active` enum('yes','no') NOT NULL DEFAULT 'no',
  `price` decimal(14,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`section_id`,`group_id`,`catalog_id`),
  KEY `sortPrice` (`section_id`,`group_id`,`active`,`price`,`catalog_id`),
  KEY `catalog_id` (`catalog_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Делаю выборку
Код:
SELECT * FROM table WHERE section_id=1 AND group_id=1 AND active='yes' ORDER BY price LIMIT 12
- все быстро
Код:
SELECT * FROM table WHERE section_id=1 AND group_id=1 AND active='yes' ORDER BY price LIMIT 100000,12
- 0.562сек
По этому запросу получается 164119 записей

Сейчас разделов 37, групп 12
Планируется разделов около 500-1000, групп около 5000 - соответственно таблица еще разрастется в разы больше, боюсь, что дальше будет хуже.

Что можете посоветовать?
Правильно ли я сделал, что создал дополнительную таблицу, чтобы не джойнить?
Как вы фильтруете и сортируете большие выборки из таблиц?
 

fixxxer

К.О.
Партнер клуба
Для начала в таких случаях всегда смотреть explain.

Вместо огромных оффсетов использовать условия диапазонов по индексу - скажем, минимальная/максимальная цена и сортировка по оной.
Так и UI можно сделать удобнее - постраничка на 100500 страниц штука довольно бессмысленная, осмысленные человеческие фильтры намного приятнее.
Если все же нужна постраничка - то, например, order by price, id и вместо оффсетов условие вида where price >= $lastProductFromPreviousPage.price and id > $lastProductFromPrevousPage.id limit 10
 

WMix

герр M:)ller
Партнер клуба
Я джойнил бы, заменил бы engine на innodb, а если уже cache делать то слепил бы побольше инфы, название группы там, аттрибуты товаров и в какуюнить nosql базу залил бы
 
Сверху