ru_dmitriid


О королях и капусте


Previous Entry Share Next Entry
Запрос, как много в этом звуке...
happy
dmitriid wrote in ru_dmitriid
Разбираюсь на работе с базами данных. Краем глаза читаю «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...




ЗАПОЗДАЛЫЙ АПДЕЙТ. Во тором случае забыл просто кавычку после второй даты закрыть :) Что оно в итоге искало — хз :)
Tags: ,

  • 1
Ну интересно ещё будет, а не вылезут ли вперёд форки, скажем Drizzle?
Народ ропщет несколько на сан...

Сложно сказать... У MySQL ест ьположение, которое единичным энтузиастам сложно сдвинуть с места. Если 6-ка будет настолько хороша, насколько, по слухам, в нее влил Гугл (типа распределенность, удучщения в стабильности), то хз :)

Ну посмотрим

  • 1
?

Log in