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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизация запроса 
:(
    Опции темы
Muchenik
Дата 1.7.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 5



Доброго времени суток. Помогите пожалуйста советом.

Есть таблица размером около 400 тыс.  с постоянным ростом.

На выполнение элементарного запроса

Код

SELECT COUNT( * ) cnt
FROM ht
WHERE 1
AND ht.country = '1179951080'
AND ht.visible <>0


уходит около 2-3 сек. Условию удовлетворяет около 140тыс. записей. Что с довольно быстрым хостингом очень много для такого запроса (ИМХО).

Таблица состоит около 50 полей (знаю много smile). 

Таблица без динамических полей. Частичная структура следующая:

Код

CREATE TABLE IF NOT EXISTS `ht` (
  `id` int(11) NOT NULL auto_increment,
  `country` int(11) default NULL,
......

  KEY `location_key` (`country`,`province`,`city`),
) ENGINE=MyISAM


id    select_type    table    type    possible_keys                      key    key_len    ref    rows    Extra
1    SIMPLE              ht             ref          vis,location_key    location_key    5          const    131835    Using where


Это нормально, что при поиске затрагиваются 131835 записей?
Может быть есть рекомендации.

Спасибо за любой совет.







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


Чо?
****


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

Репутация: 33
Всего: 161



Цитата(Muchenik @  1.7.2009,  22:13 Найти цитируемый пост)
Может быть есть рекомендации

если этоту информацию необходимо получать весьма часто, надо материализовывать аггрегацию.
Завести сбоку табличку с ключем по country и значением count. и вести ее из триггера на вашей табличке, запросы выполнять к ней.

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




Это сообщение отредактировал(а) Zloxa - 1.7.2009, 22:38


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
baldina
Дата 1.7.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

ht.visible <>0
 заменить на равенство можно? и проиндексировать
PM MAIL   Вверх
Zloxa
Дата 2.7.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

Репутация: 33
Всего: 161



Цитата(baldina @  1.7.2009,  23:49 Найти цитируемый пост)
заменить на равенство можно? и проиндексировать 

А смысл? Селективность отбора по такому индексу, судя по логике, будет весьма велика


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Muchenik
Дата 3.7.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 5



Индекс по visible есть. 
Там я приводил пример explain, все равно я так понял что используется один ключ.
PM MAIL ICQ   Вверх
dvamaster
Дата 7.7.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 10



если поле visible BIT, то стоит его поставить в условии первым
да и ключик можно (visible, country)
у меня тоже есть база, где миллионы записей, условие по трем полям (ключь по этим трем полям), 2 inner и 8 left join`ов, выполняется 0,284 сек (результат - от 0 до 1000 записей)


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Zloxa
Дата 7.7.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

Репутация: 33
Всего: 161



Цитата(dvamaster @  7.7.2009,  08:45 Найти цитируемый пост)
до 1000 записей

Миллионы делим на 1000 и получаем селективность < 0,1% при столь низкой селективности, индексы действительно очень эффективны.

В ситуации же, описанной ТС, ожидать что селективность отбора по комбинации (visible, country) будет достаточно низка - не приходится. 
О чем он и говорит:
Цитата(Muchenik @  1.7.2009,  22:13 Найти цитируемый пост)
таблица размером около 400 тыс.


Цитата(Muchenik @  1.7.2009,  22:13 Найти цитируемый пост)
Условию удовлетворяет около 140тыс. записей.

селективность = 140/400=35%
Это ОЧЕНЬ высокая селективность. Эффект от использования индексов, даже если и будет заметен, врядли оукпит затраты на содержание этих самых индексов.


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


 




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


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

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