Задавайте вопросы, мы ответим
Вы не зашли.
здравствуйте,
не знаю в какой раздел запостить вопрос потому задам его сдесь, если сочтёте нужным то пожалуйста модераторы перенесите.
есть большая таблица с ордерами (под сайтом интернет-магазином), нужно сделать выборку за, скажем, последний месяц и привязать к этой таблице другие таблици, такой запрос исполняется очень долго (3сек и более), понятно что нужно уменьшить количество строк в первой таблице (в даном случае "ордеры" ) и потом уже привязывать к ней другие таблицы.
понятно что можна сделать "select * from (select * from orders order by orders_id desc limit 1000) as o left join ...." и будет производится выборка и склеивание из 1000 записей. но можна (в этом и вопрос можна ли?) сделать и культурней используя сегментацию таблиц, как это есть в оракле.
знаю что в Оракле существует сегментация таблиц, тоесть таблица разделена на сегменты. и если указать то можна обращатся к определённому сегменту, скажем ордеры за последний квартал или месяц. или если не указывать сегмент то выборка будет со всей таблицы.
ВОПРОС: есть ли такая сегментация (секции) в MySQLе, и если есть то приведите пожалуйста простенький пример оглашения и использования?
заранее спасибо за ответ.
Неактивен
Это называется TABLE PARTITIONING, доступно только начиная с 5.1, которая еще не стабильна.
С другой стороны, оно Вам не поможет. Проблема выборки не в том, что таблица не разбита, а в том,
что Вы не ограничиваете набор данных, как следствие - делаете полный проход по табличке.
Почти наверняка, Вы хотите разбивать эти данные по страницам, и Вам за раз нужно выбрать данные
одной страницы. Тогда разумнее всего делать как-то так:
SELECT o.id, o.`date`, d.val1, ...
FROM orders o
JOIN descriptions d USING (id)
WHERE o.`date` BETWEEN '2008-10-01' AND '2008-11-01'
ORDER BY o.`date`
LIMIT 30,10
Это выберет четвертую страничку. Нужны ключики на o.`date` и d.id.
Неактивен
paulus написал:
Это называется TABLE PARTITIONING, доступно только начиная с 5.1, которая еще не стабильна.
Спасибо за наводку. будем ждать стабильной версии.
Вы немножко ошибаетесь, выборку я ограничиваю (по магазину (их несколько) и по разделу, это кстати индексы) но ордеров всё равно много так как информация храница ВСЯ, тоесть за всё время существования магазина и если мне надо выбрать например самый продаваемый товар (в определённом магазине и в определённом разделе) за вчера (поле "дата" к сожалению не индекс) то приходится выбирать и из прошлогодних, например, тоже потому и пришла идея (из оракла) сегментировать таблицу, нанапример, по квартально. и выборку делать уже в последнем (по дате) сегменте.
Нашёл временный выход, - что-то типа ручной сегментации
Select o.* , p.*
from (Select * from orders order by orders_id desc limit 1000) as o left join products as p (p.orders_id = o.orders_id)
where shops_id = ....
and characters_id = ...
....
, где 1000 скажем количество ордеров за неделю.
Неактивен
А почему не добавить индекс по дате?
Неактивен