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

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

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

Вы не зашли.

#1 16.01.2009 21:51:29

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Запрос постоянно падает в slow query log не смотря на наличие индексов

Вот такой вот запрос падает постоянно в лог тормазящих запросов:

SELECT `link` , `id` , `code` , `allowview` , `allview`
FROM `adv`.`banners`
WHERE (
`zone` = 'photo'
OR `zone` = 'all'
)
AND `position` = 'footer'
AND `active` = 'da'
AND `allowview` >=1
ORDER BY RAND( )
LIMIT 0 , 1


запрос занял 0.0295 сек

Таблица всего в 27 строк, следующей структуры:

CREATE TABLE `banners` (
  `id` int(4) NOT NULL auto_increment,
  `position` enum('top','upper','footer') NOT NULL default 'top',
  `code` varchar(500) NOT NULL,
  `allowview` bigint(15) NOT NULL,
  `allview` bigint(15) NOT NULL,
  `click` int(8) NOT NULL,
  `zone` enum('map','blog','forum','file','photo','page','all','reg','index','er404') NOT NULL default 'all',
  `active` enum('da','net') NOT NULL,
  `link` varchar(250) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id` (`id`,`position`,`code`,`allowview`,`allview`,`click`,`zone`,`active`,`link`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251


EXPLAIN запроса таков:

select_type = SIMPLE
table = banners
type = index
possible_keys = NULL
key = id
key_len = 781
ref = NULL
rows = 27
Extra = Using where; Using index; Using temporary; Using filesort

Самое страшное что данный запрос делается ТРИЖДЫ почти при генерации любой страницы (служба рекламы на сайте сверху, снизу, посерёдке).

Ну и собственно вопрос ЧТО не так? Ошибся в чём-то?

Неактивен

 

#2 16.01.2009 22:04:49

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Запрос постоянно падает в slow query log не смотря на наличие индексов

Так как в выборке нет запроса по id составной индекс не используется. Составной индекс может использоваться только последовательно. Добавьте индекс KEY(position, active, zone, allowview) и в запросе заменить OR на IN ( zone IN ('photo', 'all') )

На самом деле проблема в том, что таблица часто обновляется. allview видимо обновляется при каждом просмотре. Имеем много апдейтов и много селектов к одной таблице. Они блокируют друг друга. Простое быстрое решение - перевести таблицу на InnoDB. Настоящее решение - статистические поля (к которым идет update) хранить в отдельной таблице. Тогда и кэш запросов будет работать http://webew.ru/articles/1041.webew

Неактивен

 

#3 16.01.2009 22:11:10

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Запрос постоянно падает в slow query log не смотря на наличие индексов

ВАХ! запрос занял 0.0021

Спасибо огромнейшее.

И про относ статистических полей тоже понял. Кеш запросов лишним не будет.

Да действительно каждый просмотр это ещё и update с изменением 2 полей allowviewm allview.

СПАСИБО!!!

Неактивен

 

Board footer

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