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

Как да накарам тази заявка да се изпълнява по-бързо?

Индекси

  • Нуждаете се от - поне - индекс на всяко поле, което се използва в JOIN състояние.

  • Индекси на полетата, които се появяват в WHERE или GROUP BY или ORDER BY клаузите също през повечето време са полезни.

  • Когато в таблица се използват две или повече полета в JOIns (или WHERE или GROUP BY или ORDER BY), комбиниран (комбиниран) индекс на тези (две или повече) полета може да бъде по-добър от отделните индекси. Например в SiteNumbers таблица, възможните индекси са съставният (number_accountid, number_active) или (number_active, number_accountid) .

  • Състоянието в полета, които са булеви (ВКЛ./ИЗКЛ., активно/неактивно) понякога забавят заявките (тъй като индексите не са селективни и следователно не са много полезни). Преструктурирането (нормализиране на бащата) на таблиците е опция в този случай, но вероятно можете да избегнете допълнителната сложност.

Освен обичайните съвети (разгледайте плана EXPLAIN, добавете индекси, където е необходимо, тествайте варианти на заявката),

Забелязвам, че във вашата заявка има частичен декартов продукт. Таблицата Accounts има връзки едно към много към три таблици FTPDetails , SiteNumbers и PPC . Това има ефект, че ако имате например 1000 акаунта и всеки акаунт е свързан, да речем, с 10 FTPDetails, 20 SiteNumbers и 3 PPC, заявката ще върне за всеки акаунт 600 реда (продуктът от 10x20x3). Общо 600 000 реда, където много данни се дублират.

Вместо това можете да разделите заявката на три плюс едно за основни данни (Акаунт и останалите таблици). По този начин ще бъдат прехвърлени само 34K реда данни (с по-малка дължина):

Accounts JOIN Clients JOIN Users 
  (with all fields needed from these tables)
  1K rows

Accounts JOIN FTPDetails
  (with Accounts.account_id and all fields from FTPDetails)
  10K rows

Accounts JOIN SiteNumbers
  (with Accounts.account_id and all fields from SiteNumbers)
  20K rows

Accounts JOIN PPC
  (with Accounts.account_id and all fields from PPC)
  3K rows

и след това използвайте данните от 4-те заявки в клиентската страна, за да покажете комбинирана информация.

Бих добавил следните индекси:

Table Accounts
  index on (account_designer)
  index on (account_client)
  index on (account_active, account_id)
  index on (account_update)

Table FTPDetails
  index on (ftp_active, ftp_accountid)

Table SiteNumbers
  index on (number_active, number_accountid)

Table PPC
  index on (ppc_active, ppc_accountid)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. мога ли да използвам променлива, за да посоча OUTFILE в mysql

  2. MySQL деактивира всички тригери

  3. Какво е новото с MySQL репликацията в MySQL 8.0

  4. Архивиране на таблица с колона GEOMETRY с помощта на mysqldump?

  5. Индексът на Varchar прави ли разлика в производителността?