2016-01-02 3 views
0

У меня есть 3 таблицы:Запрос Mysql с заказом. Странная план выполнения

Product (about 700000 rows) 
ProductId int(11) AI PK 
ManufacturerId int(11) FK 
Name varchar(256) 
Description text 
SKU varchar(64) 
Code varchar(64) 
ArtId int(11) 
StockStateId int(2) FK 
Quantity int(11) 
QuantityText varchar(61) 
Price decimal(12,2) 
CurrencyId int(2) 
AutoImport bit(1) 
ImpactOnBalance bit(1) 
HasPhoto bit(1) 
HasParams bit(1) 

StockState (3 rows) 
StockStateId int(2) AI PK 
Name varchar(64) 

Manufacturer (about 200 rows) 
ManufacturerId int(11) AI PK 
Name varchar(64) 
Description text 
SortOrder int(11) 

Это мой запрос

select 
    p.ProductId 
    ,p.Name 
    ,p.Quantity 
    ,p.QuantityText 
    ,m.ManufacturerId 
    ,m.Name as ManufacturerName 
    ,ss.StockStateId 
    ,ss.Name as StockStateName 
from Product p 
inner join Manufacturer m on m.ManufacturerId = p.ManufacturerId 
inner join StockState ss on ss.StockStateId = p.StockStateId 
order by p.ProductId asc 
limit 1000, 25 

Я не могу понять, почему MySQL не использует правильные индексы (это занимает ~ 10 сек, чтобы получить результат). План выполнения выглядит следующим образом: first query. я могу заставить MySQL использовать первичный индекс

from Product p force index (primary) 

Это будет увеличивать производительность 0.015s, но я собираюсь использовать этот запрос в СП, где порядок зависит от входного параметра. Поэтому я добавил манекен случай состоянию

set @order = ''; 
select 
    p.ProductId 
    ,p.Name 
    ,p.Quantity 
    ,p.QuantityText 
    ,m.ManufacturerId 
    ,m.Name as ManufacturerName 
    ,ss.StockStateId 
    ,ss.Name as StockStateName 
    from Product p force index (primary) 
inner join Manufacturer m on m.ManufacturerId = p.ManufacturerId 
inner join StockState ss on ss.StockStateId = p.StockStateId 
order by case when @order = '' then p.ProductId end asc 
limit 1000, 25 

Этот запрос должен иметь тот же план выполнения, как и предыдущий (упорядочение по тому же колонку, которая PK), но нет, у меня FileSort. third query

Почему это? Может ли кто-нибудь помочь мне исправить это? (Повысить производительность запросов) г

ответ

0

Я думаю, вы должны попробовать это, есть левое соединение концепции и т.д.

set @order = ''; 
select 
    p.ProductId 
    ,p.Name 
    ,p.Quantity 
    ,p.QuantityText 
    ,m.ManufacturerId 
    ,m.Name as ManufacturerName 
    ,ss.StockStateId 
    ,ss.Name as StockStateName 
    from Product p force index (primary) 
//this line what I mean 
inner join Manufacturer m on p.ManufacturerId = m.ManufacturerId 
//also this line what I mean 
inner join StockState ss on p.StockStateId = ss.StockStateId 
order by case when @order = '' then p.ProductId end asc 
limit 1000, 25 

Потому что вы должны проверить строку вашего продукта, а затем присоединиться к Производитель

, если вы проверите Производитель, это будет проблемой, если строка в Производитель отсутствует в продукте (время расточительства)

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