Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли 3 запроса выполнить за 1 раз? 
V
    Опции темы
Coder
Дата 2.6.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 1
Всего: 11



Код

select * from _info where (user_id=2) order by date_time desc limit 1;

У меня в локальной копии БД 1`965`603 записей, такой запрос в среднем выполняется за 1 секунду. Рабочий комп - Pentium M 1.6, 1Gb.

Сервер конечно мощнее, но и данных там больше.
PM MAIL   Вверх
Akina
Дата 2.6.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Coder @  2.6.2008,  15:03 Найти цитируемый пост)
У меня в локальной копии БД 1`965`603 записей, такой запрос в среднем выполняется за 1 секунду

Это говорит об отсутствии индекса. Или об использовании неправильного индекса.
давай начнем с цитирования структуры таблицы, включая индексы, и explain-а вот этого распоследнего запроса.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Feldmarschall
Дата 2.6.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



возможно, может понадобиться составной индекс user_id, date_time

Если в консоли выполнить запрос EXPLAIN select * from _info where (user_id=2) order by date_time desc limit 1; - что выведет?
PM   Вверх
Coder
Дата 2.6.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 1
Всего: 11



Akina
Код

CREATE TABLE _info (
    id    INT UNSIGNED NOT NULL AUTO_INCREMENT,
    user_id    INT UNSIGNED NOT NULL,
    date_time    DATETIME NOT NULL,
    param1    DOUBLE NOT NULL,
    param2    DOUBLE NOT NULL,
    param3    FLOAT NOT NULL,
    param4    INT    UNSIGNED NOT NULL,
    PRIMARY KEY (id),
    KEY (user_id),
    KEY (date_time)
) ENGINE=MyISAM DEFAULT CHARACTER SET 'cp1251'; 


Код

explain select * from _info where (user_id=1) order by date_time desc limit 1;

выдает:
Код

| id | select_type | table    | type | possible_keys | key    | key_len | ref   | rows   | Extra
|  1 | SIMPLE      | gps_info | ref  | user_id       | user_id| 4       | const | 177026 | Using where; Using filesort


PM MAIL   Вверх
Feldmarschall
Дата 2.6.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



попробуй сделать 
Код

create index u_date on _info (user_id,date_time);

оно уберет filesort и должно стать быстрее.
PM   Вверх
Coder
Дата 3.6.2008, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 1
Всего: 11



Feldmarschall, и правда! Теперь время выполнения такой выборки = 0.00. И колонка Extra показывает, что используется только where.

Мне только не понятно, почему не был создан индекс при создании базы данных? Я же явно указал -  KEY (date_time). Или тут дело именно в составном индексе?


Feldmarschall,  +1

Это сообщение отредактировал(а) Coder - 3.6.2008, 02:37
PM MAIL   Вверх
skyboy
Дата 3.6.2008, 03:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Coder @  3.6.2008,  01:35 Найти цитируемый пост)
тут дело именно в составном индексе

два индекса использоваться не могут, а у тебя ведь условие по одному и сортировка по другому.
потому составной ключ решил проблему. 
а ещё, так как where выполняется до сортировки, то порядок следования полей в объявлении индекса должен быть именно таким.
PM MAIL   Вверх
Feldmarschall
Дата 3.6.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



Coder, насколько я себе это представляю.
индекс - это файл, который, грубо говоря, состоит из пар "значение поля - позиция в файле", отсортированный по значению поля. 
Поиск по отсортированному списку происходит на порядки быстрее.
В случае с одиночным индексом он используется, но помогает выбрать только строки одного юзера - а их 17 тысяч. А их уже приходится сортировать заново - ведь индекс по дате здесь не получится использовать - он тоже по всему файлу строится, и без информации о юзере.
А составной индекс отсортирован по двум полям, то есть, имеет вид
1, 2001
1, 2002
1, 2003
2, 2001
2, 2005
5, 2008

соответственно, поиск сводится нахождению сначала юзера, а потом - максимальной даты для него.

PM   Вверх
Coder
Дата 4.6.2008, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 1
Всего: 11



Feldmarschall, доходчиво.

Помечаю вопрос ка решенный.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.