Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2011, 12:00   #1
Lexus_RX_300
 
Регистрация: 13.02.2008
Сообщений: 5
По умолчанию Оптимизиция запроса select ... where ... order by price limit 200 из бд в 18 000 000 записей

База:
CREATE TABLE IF NOT EXISTS `gate_spo_price_egipt_table` (
`id` bigint(16) NOT NULL AUTO_INCREMENT,
`date_from` date NOT NULL,
`date_to` date NOT NULL,
`country` int(11) NOT NULL,
`city` int(11) NOT NULL,
`hotel` int(11) NOT NULL,
`operator` int(11) NOT NULL,
`star` int(11) NOT NULL,
`room` int(11) NOT NULL,
`pansion` int(11) NOT NULL,
`depature_from` int(11) NOT NULL,
`depature_to` int(11) NOT NULL,
`depature_date` date NOT NULL,
`days` int(11) NOT NULL,
`price` int(11) NOT NULL,
`status` tinyint(4) NOT NULL,
`chld` int(11) NOT NULL,
`age1` int(11) NOT NULL,
`age2` int(11) NOT NULL,
`age3` int(11) NOT NULL,
`age4` int(11) NOT NULL,
PRIMARY KEY (`id`,`depature_date`),
KEY `seach_gate` (`depature_date`,`room`,`days`,`sta tus`,`operator`,`chld`,`hotel`),
KEY `seach_sort` (`price`,`depature_date`,`room`,`da ys`,`status`,`operator`,`chld`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
/*!50100 PARTITION BY RANGE (DAYOFYEAR(depature_date))
(PARTITION p0 VALUES LESS THAN (152) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (158) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (164) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (170) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (176) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (181) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (187) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN (194) ENGINE = InnoDB,
PARTITION p8 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ AUTO_INCREMENT=40039238726 ;


запрос вида : select * from gate_spo_price_egipt_table use index (seach_sort) where depature_date >= 2011-06-20 and depature_date <= 2011-06-30 and room = 23 order by price asc limit 200.
Выполняется 4 минуты, что неприемлимо. Конфигурацию сервера и субд менять слишком дорого.
Применяется:
1. Индекс
2. Партицирование по 6 дней (для быстрого поиска)

Как правильно построить индекс, или что можно сделать для увеличения производительности, потому, что время выполнения запроса доходит на 2 минут.

По поводу индексов: у меня возможен поиск по полям (указывается в форме):
`country` (уже разделил таблицу по странам - можно не указывать. на форме можно выбрать только 1 страну, так что соединение таблиц не происходит)
`city`
`hotel`
`operator`
`star`
`room`
`days`
`price` - поэтому и в индексе содержится почти все.
По `depature_date` (по 6 дней сделал партицирование).
Lexus_RX_300 вне форума Ответить с цитированием
Старый 17.06.2011, 12:02   #2
Lexus_RX_300
 
Регистрация: 13.02.2008
Сообщений: 5
По умолчанию

Что можно сделать для увеличения производительность и как правильно построить индекс?
Lexus_RX_300 вне форума Ответить с цитированием
Старый 17.06.2011, 12:12   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если СУБД поддерживает BETWEEN то
depature_date BETWEEN 2011-06-20 and 2011-06-30
обычно быстрей работает.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочешь 30 000 рублей? положи в банк 10 000 руб на 13 лет :) Alar Свободное общение 33 16.06.2011 12:30
Конкурс программистов - призовой фонд 1 000 000 рублей Lnat Свободное общение 0 26.07.2008 12:15