Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
База:
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`,`status`,`operator`,`chld`,`hotel`),
KEY `seach_sort` (`price`,`depature_date`,`room`,`days`,`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_key) 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 дней (для быстрого поиска)
Неактивен
Вопрос 1. Как правильно расставляются комбинированные индексы (по неск. полям сразу), потому, что они были до начала оптимизации?
Вопрос 2. Какие еще варианты оптимизации можно применить?
Неактивен
Для начала давайте посмотрим EXPLAIN
Неактивен
Давайте. EXPLAIN чего именно? запроса или базы? Можете рассказать как мне с помощью EXPLAIN отследить какая часть запроса тормозит?
Неактивен
lexey2006.90 написал:
Давайте. EXPLAIN чего именно? запроса или базы? Можете рассказать как мне с помощью EXPLAIN отследить какая часть запроса тормозит?
Неактивен
mysql> explain select * from gate_spo_price_egipt 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;
+----+-------------+----------------------+------+---------------+------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------------+------+---------------+------+---------+------+------+-----------------------------+
| 1 | SIMPLE | gate_spo_price_egipt | ALL | NULL | NULL | NULL | NULL | 0 | Using where; Using filesort |
+----+-------------+----------------------+------+---------------+------+---------+------+------+-----------------------------+
1 row in set, 4 warnings (0.00 sec)
Неактивен
Неактивен
Как сделать так, чтобы запрос с explain возвращал значения, потому, что запрос:
select * from gate_spo_price_egipt 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 - возвращает значения, но в то же время запрос:
explain select * from gate_spo_price_egipt 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 возвращает то, что написал в прошлом письме.
По поводу индексов: у меня возможен поиск по полям (указывается в форме):
`country` (уже разделил таблицу по странам - можно не указывать. на форме можно выбрать только 1 страну, так что соединение таблиц не происходит)
`city`
`hotel`
`operator`
`star`
`room`
`days`
`price` - поэтому и в индексе содержится почти все.
По `depature_date` (по 6 дней сделал партицирование).
По поводу тестирования: mysql кэширует запросы (даже похожие). Поэтому невозможно понять сколько будет выполняться запрос. Можно ли отключить кэширование? На серваке стоит mysql 5.5.13.
Неактивен
Еще 1 дополнение: тестирую через консоль на серваке, поэтому других причин тормоза выборки и сортировки быть не может, кроме как объем таблицы.
Неактивен
Страниц: 1