2015-01-11 4 views
1

Я очень новичок в индексировании MySQL. Я пытаюсь создать индексы для таблицы web_products. Я создал индекс IsDataActive_IsVerified_IsExpired_Price_Sale, чтобы оптимизировать нижеследующий запрос;Как оптимизировать MySQL-запрос с использованием индексов с несколькими столбцами?

SELECT 
MAX(Price_Sale) as maxColumn 
FROM 
`web_products` `t` 
WHERE 
IsDataActive = 1 AND IsVerified = 1 
    AND IsExpired = 0 

и когда я анализирую запрос с использованием Explain Я получаю наилучший результат "Select tables optimized away".

У меня есть другой запрос, который работает очень плохо. Таблица web_products может содержать миллионы продуктов. Выполнение нижеследующего запроса занимает несколько минут;

SELECT 
COUNT(P.BrandID) 
FROM 
web_products AS P 
WHERE 
P.OriginalItemID IS NULL 
    AND P.IsDataActive = 1 
    AND P.IsExpired = 0 
    AND P.IsVerified = 1; 

BrandID является FK в brands таблице. Ниже приведено сообщение Explain Analysis. Как оптимизировать вышеуказанный запрос?

Update 1

The Index упоминается в ответе очаровательно работает для вышеупомянутых запросов. Я получаю результаты менее чем за 0,200 мс.

Я изменил второй запрос и добавил MerchantID к индексу теперь требуется 1 секунда для выполнения нижеследующего запроса. Объяснение показывает, число rows examined составляет 88331. Есть ли способ довести время выполнения до миллисекунды?

SELECT 
P.BrandID, COUNT(P.BrandID) as Count, B.Name 
FROM 
web_products AS P 
    inner join 
web_brands as B ON P.BrandID = B.ID 
    INNER JOIN 
web_merchants M ON P.MerchantID = M.ID 
    LEFT JOIN 
web_products_features F ON P.ID = F.Product_ID 
WHERE 
P.OriginalItemID IS NULL 
    AND P.IsDataActive = 1 
    AND P.IsExpired = 0 
    AND P.IsVerified = 1 
    AND B.IsDataActive = 1 
group by P.BrandID 
order by Count desc 
Limit 100 
+1

LIMIT бесцельно здесь – Strawberry

+0

@Strawberry Спасибо ... Я понимаю это. Запрос был динамически генерирован во время выполнения. –

+0

@Strawberry Edited. –

ответ

1

Лучший показатель для обоих запросов, вероятно:

web_products(IsDataActive, IsExpired, IsVerified, OriginalItemId, BrandId, Price_Sale) 

Порядок первых трех столбцов неважно. Это должно работать для первого запроса, потому что это индекс покрытия. Если это повлияет на производительность, используйте два индекса и отбросьте Price_Sale.

+0

Привет, это сработало для обоих запросов. Я изменил запрос с несколькими объединениями. Есть ли способ уменьшить количество проверенных строк или время выполнения с 1 секунды? Я обновил вопрос. –

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