У меня есть 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
Почему это? Может ли кто-нибудь помочь мне исправить это? (Повысить производительность запросов) г