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

сложната заявка отнема твърде много време за прехвърляне

Имате нужда от съставен индекс на пресечната таблица:

ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);

Редът на колоните в този индекс е важен!

Това, на което се надявате, е, че обединенията ще започнат с таблицата с инструменти, след което ще потърсите съвпадащия запис в индекса в съставния индекс въз основа на id_instrument. След това, след като намери този запис в индекса, той разполага със свързания id_tool безплатно. Така че изобщо не трябва да чете таблицата instrument_tools, трябва само да прочете записа в индекса. Това трябва да даде коментара „Използване на индекс“ във вашето EXPLAIN за таблицата instruments_tools.

Това би трябвало да помогне, но не можете да избегнете временната таблица и filesort, тъй като колоните, по които групирате и сортирате, не могат да използват индекс.

Можете да опитате да накарате MySQL да избягва записването на временната таблица на диск, като увеличите размера на паметта, която може да използва за временни таблици:

mysql> SET GLOBAL tmp_table_size = 256*1024*1024;      -- 256MB
mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB

Тази цифра е само пример. Нямам представа колко голяма трябва да бъде за временната таблица във вашия случай.




  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 SELECT редове, съответстващи на масив?

  2. Как да показвате стойностите на редове като колони в MySQL

  3. Управление на количката и складовите наличности

  4. Събиране на SUM на две независими таблици

  5. Как да създадете „двустранен“ уникален индекс на две полета?