Разбираюсь на работе с базами данных. Краем глаза читаю «High performance MySQL». Решаю опробовать полученные навыки на практике. Хм...

Есть у нас таблица, разбитая на пратиции по неделям:


CREATE TABLE `price_detail` (
`accomodation` int(11) NOT NULL,
`date` datetime NOT NULL,
`price` int(11) NOT NULL,
`room_id` int(11) NOT NULL,
KEY `idx_price_date` (`date`) USING BTREE,
KEY `idx_price` (`price`) USING BTREE,
KEY `idx_price_accomodation` (`accomodation`) USING BTREE
)
PARTITION BY RANGE (TO_DAYS(`date`)) (
PARTITION p20080101 VALUES LESS THAN (733407),
PARTITION p20080108 VALUES LESS THAN (733414),
/* и так далее — на целый год */


Нда... И индексы тож...

На каждую неделю у нас ни много ни мало — 26 миллионов записей в худшем случае. Для тестирования выбран именно худший случай.

Смотрим, как у нас будет работать выборка из этой базы:

Запрос первый:
explain partitions select accomodation from price_detail where accomodation=1 and date BETWEEN '2008-01-01 12:00:00.000' AND '2008-01-14 12:00:00.000'G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: price_detail partitions: p20080108,p20080115 type: ref possible_keys: idx_price_date,idx_price_accomodation key: idx_price_accomodation key_len: 4 ref: const rows: 40292 Extra: Using where

Запрос второй:

explain partitions select accomodation from price_detail where date BETWEEN '2008-01-01 12:00:00.000' AND '2008-01-14 12:00:00.000 AND accomodation=1'G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: price_detail partitions: p20080108,p20080115,p20080122,p20080129,p20080205,p20080212,p20080219, p20080226,p20080304,p20080311,p20080318,p20080325,p20080401,p20080408, p20080415,p20080422,p20080429,p20080506,p20080513,p20080520,p20080527, p20080603,p20080610,p20080617,p20080624,p20080701,p20080708,p20080715, p20080722,p20080729,p20080805,p20080812,p20080819,p20080826,p20080902, p20080909,p20080916,p20080923,p20080930,p20081007,p20081014,p20081021, p20081028,p20081104,p20081111,p20081118,p20081125,p20081202,p20081209, p20081216,p20081223,p20081230,p20090106,p20090113,p20090120,p20090127 type: ALL possible_keys: idx_price_date key: NULL key_len: NULL ref: NULL rows: 274845000 Extra: Using where

Звезда в шоке.

Ушел читать covering index...