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

Наказание за производителност за вложени mysql заявки

Отговорът на този въпрос зависи от това дали използвате mysql преди 5.7 или 5.7 и след това. Може леко да променя въпроса ви, но се надявам, че следното ще улови това, което търсите.

Вашият SELECT * FROM Table прави сканиране на таблица чрез клъстерирания индекс (физическото подреждане). В случай на липса на първичен ключ, един е имплицитно на разположение на двигателя. Няма клауза къде, както казваш. Не се прави опит за филтриране или избор на друг индекс.

Обяснение изход (вижте също ) показва 1 ред в обобщението си. Това е сравнително право напред. Обяснението на изхода и производителността с извлечената от вас таблица B ще се различава в зависимост от това дали използвате версия преди 5.7 или 5.7 и след това.

Документът Извлечени таблици в MySQL 5.7 описва го добре за версии 5.6 и 5.7, където последната няма да осигури неустойка поради промяната в материализирания изход на извлечената таблица, която се включва във външната заявка. В предишни версии се понасяха значителни режийни разходи с временни таблици с извлечените.

Доста лесно е да се тества загубата на производителност преди 5.7. Необходима е само таблица със среден размер, за да видите забележимото въздействие, което произведената от вашия въпрос таблица оказва върху ефективността. Следният пример е на малка таблица във версия 5.6:

explain 
select qm1.title  
from questions_mysql qm1 
join questions_mysql qm2 
on qm2.qid<qm1.qid 
where qm1.qid>3333 and qm1.status='O';
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| id | select_type | table | type  | possible_keys   | key     | key_len | ref  | rows  | Extra                                          |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
|  1 | SIMPLE      | qm1   | range | PRIMARY,cactus1 | PRIMARY | 4       | NULL |  5441 | Using where                                    |
|  1 | SIMPLE      | qm2   | ALL   | PRIMARY,cactus1 | NULL    | NULL    | NULL | 10882 | Range checked for each record (index map: 0x3) |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+


explain 
select b.title from 
(   select qid,title from questions_mysql where qid>3333 and status='O' 
) b 
join questions_mysql qm2 
on qm2.qid<b.qid; 
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| id | select_type | table           | type  | possible_keys   | key     | key_len | ref  | rows  | Extra                                              |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
|  1 | PRIMARY     | qm2             | index | PRIMARY,cactus1 | cactus1 | 10      | NULL | 10882 | Using index                                        |
|  1 | PRIMARY     | <derived2>      | ALL   | NULL            | NULL    | NULL    | NULL |  5441 | Using where; Using join buffer (Block Nested Loop) |
|  2 | DERIVED     | questions_mysql | range | PRIMARY,cactus1 | PRIMARY | 4       | NULL |  5441 | Using where                                        |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+

Забележете, промених въпроса, но той илюстрира въздействието, което извлечените таблици и липсата на използване на индекси с оптимизатора оказват във версиите преди 5.7. Извлечената таблица се възползва от индекси, тъй като се материализира. Но след това издържа режийни като временна таблица и се включва във външната заявка без използване на индекс. Това не е така във версия 5.7




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Openshift:Как да получите отдалечен достъп до MySQL?

  2. Изхвърлете всички съхранени процедури в MySQL или използвайте временни съхранени процедури

  3. Как да изберете първия ред за всяка група в MySQL?

  4. Mysql/Php - Текуща дата и час

  5. Как mysql подрежда редове със същата стойност?