SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.12.2009 14:56:05

Magnataur
Участник
Зарегистрирован: 28.07.2009
Сообщений: 4

Поиск в таблице

Делаю следующую таблицу:

drop table if exists p_test;

create table p_test (
    order_id int,
    order_date date,
    note varchar(255)
) engine = myisam
partition by range (DAYOFYEAR(order_date)) (
    PARTITION p_001 values less than (1),
    PARTITION p_002 values less than (2),
    PARTITION p_003 values less than (3),
    PARTITION p_004 values less than (4),
    PARTITION p_999 values less than (maxvalue)
);


Вставляю в неё данные:

insert into p_test (order_id, order_date, note) values (1, '2009-01-01', '01.01.09');
insert into p_test (order_id, order_date, note) values (2, '2009-01-02', '02.01.09');
insert into p_test (order_id, order_date, note) values (3, '2009-01-03', '03.01.09');
insert into p_test (order_id, order_date, note) values (4, '2009-01-04', '04.01.09');


Пытаюсь выбрать данные за 1 день:

EXPLAIN PARTITIONS SELECT * FROM p_test
WHERE order_date = '2009-01-02'


Всё нормально, MySQL обращается только к одному разделу таблицы:

+----+-------------+--------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | p_test | p_003      | ALL  | NULL          | NULL | NULL    | NULL |    6 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+-------------+

Пытаюсь выбрать за 2 дня:

EXPLAIN PARTITIONS SELECT * FROM p_test
WHERE order_date BETWEEN '2009-01-01' AND '2009-01-02'


MySQL лезет по всем разделам:

+----+-------------+--------+-------------------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | partitions                    | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------------------------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | p_test | p_001,p_002,p_003,p_004,p_999 | ALL  | NULL          | NULL | NULL    | NULL |    6 | Using where |
+----+-------------+--------+-------------------------------+------+---------------+------+---------+------+------+-------------+

Как правильно написать ворой запрос, чтобы MySQL не лезла по всем разделам ?

Неактивен

 

#2 03.12.2009 15:03:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Поиск в таблице

range-запросы всегда будут собирать пачку разделов.
Но индекс на order_date все равно сделайте smile

Неактивен

 

#3 03.12.2009 15:28:16

Magnataur
Участник
Зарегистрирован: 28.07.2009
Сообщений: 4

Re: Поиск в таблице

Ага, спасибо smile Т.е. если я хочу оптимизировать по скорости выполнения второй запрос, то мне надо писать примерно так:

SELECT * FROM p_test
WHERE order_date='2009-01-01' OR order_date='2009-01-02'


?

P.S. Примерный размер таблицы около 5 гигабайт.

Неактивен

 

#4 03.12.2009 15:41:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Поиск в таблице

Индекс создайте smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson