Професионален съвет Избягвайте SELECT *
или SELECT table.*
в чувствителни към производителността заявки. Вместо това изберете по име колоните, които всъщност трябва да използвате
Професионален съвет MySQL има прословутото нестандартно разширение за GROUP BY
които използвате и вероятно злоупотребявате. Прочети това. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
Ако следвате първия професионален съвет, следването на втория ще бъде много по-лесно.
Професионален съвет Избягвайте да „хвърляте“ много индекси с една колона с надеждата да ускорите заявките си. Вместо това създайте индекси, често съставни индекси, отговарящи на нуждите на действителната ви заявка. Прочетете това https://use-the-index-luke.com .
Професионален съвет Using temporary; using filesort
появяването в изхода EXPLAIN не е непременно лошо. Това просто означава, че машината за заявки трябва да кешира частичен набор от резултати, преди да го върне. temporary
нещо не е действителна таблица, това е RAM структура. Ако е толкова голям, че претоварва RAM, MySQL ще го разлее на диск. Но твоят не е.
Като се има предвид всичко това, нека преработим вашата заявка. Предполагам, че искате да извлечете редовете с най-големия idCartDATA
стойност за всеки CartSplitData.SUPPLIERID
.
Така че нека напишем това като подзаявка.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Тази заявка може да се ускори драстично чрез поставяне на съставен индекс в CartSplitData:(SUPPLIERID, IDCartDATA)
.
След това нека пренапишем основната ви заявка, за да намерим редовете, съответстващи на идентификаторите в тази подзаявка.
SELECT CartData.* /* * hammers performance */
CartSplitData.* /* * hammers performance */
FROM CartData
JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
JOIN (
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
)x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
AND x.IDCartData = CartSplitData.IDCartData
WHERE CartData.CartOrderref = 'XXXXXXXXX'
Вашият индекс на CartData.CartOrderref
ще помогне на тази външна заявка, както и създаденият съставен индекс ^^^.