SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.11.2008 14:21:53

Maks2002
Участник
Зарегистрирован: 24.11.2008
Сообщений: 2

Сегментация (секции) таблиц MySQL

здравствуйте,
не знаю в какой раздел запостить вопрос потому задам его сдесь, если сочтёте нужным то пожалуйста модераторы перенесите.

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

понятно что можна сделать "select * from (select * from orders order by orders_id desc limit 1000) as o left join ...."  и будет производится выборка и склеивание из 1000 записей. но можна (в этом и вопрос можна ли?) сделать и культурней используя сегментацию таблиц, как это есть в оракле.
знаю что в Оракле существует сегментация таблиц, тоесть таблица разделена на сегменты. и если указать то можна обращатся к определённому сегменту, скажем ордеры за последний квартал или месяц. или если не указывать сегмент то выборка будет со всей таблицы.

ВОПРОС: есть ли такая сегментация (секции) в MySQLе, и если есть то приведите пожалуйста простенький пример оглашения и использования?

заранее спасибо за ответ.

Неактивен

 

#2 24.11.2008 18:24:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Сегментация (секции) таблиц 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.

Неактивен

 

#3 25.11.2008 11:30:22

Maks2002
Участник
Зарегистрирован: 24.11.2008
Сообщений: 2

Re: Сегментация (секции) таблиц MySQL

paulus написал:

Это называется TABLE PARTITIONING, доступно только начиная с 5.1, которая еще не стабильна.

Спасибо за наводку. будем ждать стабильной версии.

Вы немножко ошибаетесь, выборку я ограничиваю (по магазину (их несколько) и по разделу, это кстати индексы)  но ордеров всё равно много так как информация храница ВСЯ, тоесть за всё время существования магазина и если мне надо выбрать например самый продаваемый товар (в определённом магазине и в определённом разделе) за вчера (поле "дата" к сожалению не индекс) то приходится выбирать и из прошлогодних, например, тоже потому и пришла идея (из оракла) сегментировать таблицу, нанапример, по квартально. и выборку делать уже в последнем (по дате)  сегменте.

Нашёл временный выход, - что-то типа ручной сегментации smile

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 скажем количество ордеров за неделю.

Неактивен

 

#4 25.11.2008 15:17:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Сегментация (секции) таблиц MySQL

А почему не добавить индекс по дате?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson