|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.06.2011, 12:00 | #1 |
Регистрация: 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 дней сделал партицирование). |
17.06.2011, 12:02 | #2 |
Регистрация: 13.02.2008
Сообщений: 5
|
Что можно сделать для увеличения производительность и как правильно построить индекс?
|
17.06.2011, 12:12 | #3 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Если СУБД поддерживает BETWEEN то
depature_date BETWEEN 2011-06-20 and 2011-06-30 обычно быстрей работает.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Хочешь 30 000 рублей? положи в банк 10 000 руб на 13 лет :) | Alar | Свободное общение | 33 | 16.06.2011 12:30 |
Конкурс программистов - призовой фонд 1 000 000 рублей | Lnat | Свободное общение | 0 | 26.07.2008 12:15 |