Mysql
 sql >> база данни >  >> RDS >> Mysql

Какви индекси за подобряване на производителността на JOIN и GROUP BY

Професионален съвет Избягвайте 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 ще помогне на тази външна заявка, както и създаденият съставен индекс ^^^.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Използване на DATETIME като първичен ключ

  2. PHP и MySql проверяват дали таблицата е празна

  3. Защо Hibernate/JDBC/MySQL прекъсва връзките след около ден?

  4. В SQL добре ли е две таблици да се отнасят една към друга?

  5. Не може да стартира Mysql на Mac