Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2015, 09:28   #1
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию Кеш запроса с INDEX полем и медленная выборка

Доброго времени суток. Я пользуюсь mysql 5.4. Запрос по таблице в 300к строк, в которой 60 полей, производится 3 секунды. Если создать INDEX для одного из полей в запросе, то первый запрос будет 3 секунды, а второй такой же 47мс, но стоит выполнить другой запрос и снова выполнить этот, он снова будет 3 секунды. Как сократить время запроса выборки?

INDEX создаю так:
Код:
CREATE INDEX isWill ON registry (isWill) USING BTREE;
Запрос выглядит вот так:
Код:
SELECT id,templateid,NotaryDate,registry,book,actionNum,RubSum,RubPrej,RubFree,FIO1,Canceled 
FROM registry 
WHERE 
      Deleted=FALSE AND 
      isDraft<>TRUE AND 
      ((IsInheritance=TRUE AND NotaryAction=TRUE) OR IsInheritance=FALSE)  AND 
      isWill=TRUE  
ORDER BY registry.registry DESC, registry.actionNum DESC
пыжок
maloun вне форума Ответить с цитированием
Старый 08.06.2015, 13:34   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Т.е. ты хочешь сказать что стоимость запроса плавает по непонятным причинам?
Цитата:
сли создать INDEX для одного из полей в запросе
Создай индекс для registry, actionNum и комбинированный для тех полей, что используются в where.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.06.2015, 15:53   #3
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
стоимость запроса плавает по непонятным причинам?
Причина установлена, так работает кеш запросов, его работа наладилась увеличением размера кеша
Код:
query_cache_size=1024M
Но пока кеша небыло, запрос выполнялся 3 секунды, несмотря на индексы.
Для запросов с датой я заменил YEAR(MyDate) =2015 и Month(MyDate)=6
на работу с BETWEEN в котором индексы заработали.
Код:
NotaryDate BETWEEN '2015-06-01' AND '2015-06-30'
А индексы для булевых флагов объединил в один
Код:
CREATE INDEX deleted_iswill ON registry(Deleted, isWill, isDraft)
Скорость выросла, индексы для registry.registry и registry.actionNum тоже создам, спасибо!
Хотелось бы узнать что-нибудь еще из советов по оптимизации.
пыжок

Последний раз редактировалось maloun; 08.06.2015 в 15:58.
maloun вне форума Ответить с цитированием
Старый 08.06.2015, 16:41   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да пробей EXPLAIN PLAN и посмотри стоимости запроса. Там все и увидишь. Если стоимость будет низкая, знач все норм.
Вообще оптимизация зависит от того, что ты будешь делать с таблицей. Если редактировать-дописывать, нужно одно, а если как справочник использовать в выборках - другое.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка данных для запроса albina73 БД в Delphi 2 21.12.2011 12:19
Медленная работа access satka Microsoft Office Access 5 16.08.2011 18:20
Создание запроса с расчетным полем Medvedko0116 Microsoft Office Access 2 17.05.2011 13:47
Ошибка List index out of bounds(0) при использовании запроса AdoQuery ArtInt БД в Delphi 14 15.04.2009 18:35
Создание запроса, выборка из 4 таблиц! help! angelkisss SQL, базы данных 3 03.02.2008 15:03