2012-01-17 2 views
0

Основной Сформируйте запрос является:MySql оптимизация запросов, диапазон/композитный индекс/группа по

EXPLAIN SELECT SUM(impressions) as impressions, SUM(clicks) as clicks, SUM(cost) as cost, SUM(conversions) as conversions, keyword_id FROM `keyword_track` WHERE user_id=1 AND campaign_id=543 AND `recorded`>1325376071 GROUP BY keyword_id 

кажется, что я могу либо индекс сказать user_id, CAMPAIGN_ID и keyword_id и получить GROUP BY без файла сортировать, хотя индекс диапазона на записанном действительно будет более агрессивно сокращаться по строкам, этот пример имеет большой диапазон, но другие запросы имеют гораздо меньший временной диапазон.

Таблица выглядит следующим образом:

CREATE TABLE IF NOT EXISTS `keyword_track` (
`track_id` int(11) NOT NULL auto_increment, 
`user_id` int(11) NOT NULL, 
`campaign_id` int(11) NOT NULL, 
`adgroup_id` int(11) NOT NULL, 
`keyword_id` int(11) NOT NULL, 
`recorded` int(11) NOT NULL, 
`impressions` int(11) NOT NULL, 
`clicks` int(11) NOT NULL, 
`cost` decimal(10,2) NOT NULL, 
`conversions` int(11) NOT NULL, 
`max_cpc` decimal(3,2) NOT NULL, 
`quality_score` tinyint(4) NOT NULL, 
`avg_position` decimal(2,1) NOT NULL, 
PRIMARY KEY (`track_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

Я оставлял ключи я в настоящее время из этого. В основном на вопрос, как лучше всего будет получить индекс в диапазоне, который по-прежнему индексирует хотя бы campaign_id и в идеале не нуждается в filesort (хотя это может быть приемлемым компромиссом для получения индекса диапазона в записанное время).

ответ

1

Лучший показатель для вас в этом случае является составным один user_id + campaign_id + recorded

Хотя это не поможет избежать FileSort до тех пор, пока у вас есть > сравнение с recorded и group by поле, которое не входит в индекс на всех ,

2

Всякий раз, когда у нас есть ограничение по диапазону и порядок ограничения по различным атрибутам таблицы, мы можем либо воспользоваться преимуществом быстрой фильтрации, либо быстрого упорядочивания для набора результатов, но не ОБА.

Мой ответ: Если ваше ограничение диапазона действительно сокращает огромное количество записей и приводит к небольшому набору строк, лучший индекс для поддержки ограничения диапазона. i.e (user_id, campaign_id, записано)

Если нет, я имею в виду, если действительно существует большое количество строк даже после того, как условие диапазона подтверждено и должно быть отсортировано, а затем найдите индекс, поддерживающий упорядочение. i.e (user_id, campaign_id, key_id)

Чтобы лучше понять это, взгляните на приведенную ниже ссылку, где то же самое объясняется очень четко.

http://explainextended.com/2009/04/01/choosing-index/

+1

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

+0

добро пожаловать ... – Uday

Смежные вопросы