Насколько большие таблицы? InnoDB теперь делает FULLTEXT
. MyISAM осиротел. Я согласен не использовать что-то старое, как 5.5. MariaDB имеет 10,0, 10,1, 10,2, 10,3. MySQL имеет 5,6, 5,7, 8,0. И в большинстве из них было проделано много работы по оптимизации. Возвращаясь к версии 5.5, вы, вероятно, потеряли некоторые функции оптимизации. Увы, я не заметил, что именно потеряно.
ORs
смертельно опасны для производительности. Они по существу препятствуют использованию индексов. Я не вижу очевидного способа перестановки вещей - поскольку ORs
в нескольких таблицах.
Вот несколько составных, покрывающих индексов, которые могут помочь:
pd: INDEX(ID_sProduct, ID, stock) -- perhaps this order is best
pdw: INDEX(ID_sProductDetail, stock) -- in this order
pdsp: INDEX(ID_sProductDetail, memberPanCode, ID) -- in this order
s: INDEX(memberPanCode, shownOnSite) -- in either order
Также добавьте
p: INDEX(showDate, published, ID, ID_sSupplier) -- in this order
и реструктурируйте запрос, вытянув p.*
из основного потока. В настоящее время громоздкие p. * Перемещаются через соединения и т. Д., А затем сокращаются до 3 строк. Путем реструктуризации мы можем найти, какие 3 строки сначала , , а затем извлекают все данные:
SELECT p2.*, etc.
p2.releaseDate > NOW() - INTERVAL 2 WEEK AS pNew,
etc.
FROM (
SELECT toss p.*, add p.ID, keep other columns
FROM ...
LEFT JOIN ...
ORDER BY...
LIMIT 3
) AS x
JOIN sProduct AS p2 ON x.ID = p2.ID
ORDER BY p2.showDate desc
Этот новый индекс «покрывает» тем, что все значения p
в подзапросе находятся в индексе. Я заметил, что releaseDate
можно было бы опустить и поднять со вторым использованием sProduct
.
Я ставлю sShowDate
первым в индексе, предполагая, что он хотя бы выполняет некоторую фильтрацию (p.showDate < NOW + INTERVAL 1 DAY
).
Комбинация GROUP BY
и ORDER BY
требует одного или двух файловых сортировок; они не могут быть устранены. Что я сделал, так это минимизировал их стоимость, сделав их менее громоздкими.