MySQL УДАЛЕНИЕ занимает много (40) секунд для нескольких записей, в то время как ВЫБОР тех же данных выполняется быстро - PullRequest
0 голосов
/ 28 февраля 2020

Кто-нибудь может дать некоторое представление о том, почему оператор DELETE требует больше времени для выполнения? Мы не создали ни TRIGGER, ни CASCADE. Мы начали замечать эту проблему при переходе на 8.0 с 5.5. Это проблема, связанная с настройкой параметров 8.0?

DELETE s FROM storefront s LEFT JOIN MASTER m  ON m.userid=s.userid WHERE m.userid IS NULL

9 row(s) affected 
Execution Time : 40.816 sec
Transfer Time  : 0.001 sec
Total Time     : 40.817 sec

В то же время оператор SELECT занимает всего несколько миллисекунд.

SELECT s.userid FROM storefront s LEFT JOIN MASTER m  ON m.userid=s.userid WHERE m.userid IS NULL

Total Time     : 0.05 sec

Любой помощь будет оценена. У нас есть лучшее серверное оборудование с 16 ГБ ОЗУ.

Вот информация о ПРОФИЛИРОВАНИИ для оператора DELETE.

It is CPU_user(19.046875 seconds) and CPU_system(43.156250 seconds) taking most of the time out of the total execution time 50.24 seconds ....

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Ключевое слово "MyISAM". Есть несколько причин, по которым может занимать много времени.

(я предполагаю, что обе таблицы имеют индекс на userid? И определение столбца одинаковое?)

  • SELECT будет очень быстрым, потому что он просто использует индекс для поиска рассматриваемых идентификаторов пользователей. 0,05 секунды почти кажутся «слишком медленными».
  • MyISAM будет блокировать таблицу на время действия DELETE.
  • MyISAM сохраняет каждую строку где-то в файле .MYD. Индекс находится в файле .MYI, даже для Первичного ключа.
  • Я думаю, что строка удаляется путем изменения начального байта строки. (На самом деле это байт, единственной целью которого является указание удаленного.
  • Обычно в MyISAM строка представляет собой непрерывный поток байтов в .MYD. При удалении и некоторых обновлениях дыры в .MYD остаются.
  • Вставки предпочитают заполнять отверстия сначала , увеличивая размер файла, если это не удается. Обратите внимание, что большой ряд будет связанным списком фрагментов. Это может привести к замедлению и замедлению полного заполнения. Строка Selects.
  • Oracle планирует избавиться от MyISAM.

Те, которые на самом деле не сводятся к объяснению в течение 40 секунд, чтобы удалить только 9 строк. Пожалуйста, предоставьте SHOW CREATE TABLE и EXPLAIN DELETE ...; могут быть данные, которые вы не указали или которые я ошибочно предполагаю.

Итог: измените на InnoDB, и эти проблемы исчезнут go.

0 голосов
/ 28 февраля 2020

Это не ответ, но он может помочь определить, на что тратится столько времени. Используйте ПРОФИЛИРОВАНИЕ

SET PROFILING=ON;

Ручной

**sample**

mysql> SET PROFILING=ON;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from photons where photons >= 100;
+----+---------------------+---------+
| id | mytime              | photons |
+----+---------------------+---------+
|  1 | 2020-02-26 12:00:00 |     100 |
|  3 | 2020-02-26 12:01:00 |     100 |
|  4 | 2020-02-26 12:05:00 |     200 |
+----+---------------------+---------+
3 rows in set (0.01 sec)

mysql> SHOW PROFILE ALL;
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+----------------------+-------------+
| Status               | Duration | CPU_user | CPU_system | Context_voluntary | Context_involuntary | Block_ops_in | Block_ops_out | Messages_sent | Messages_received | Page_faults_major | Page_faults_minor | Swaps | Source_function       | Source_file          | Source_line |
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+----------------------+-------------+
| starting             | 0.000130 | 0.000071 |   0.000057 |                 0 |                   0 |            0 |             0 |             0 |                 0 |                 0 |                 0 |     0 | NULL                  | NULL                 |        NULL |
| checking permissions | 0.002022 | 0.000127 |   0.000103 |                 2 |                   0 |          160 |             0 |             0 |                 0 |                 2 |                 1 |     0 | check_access          | sql_authorization.cc |         802 |
| Opening tables       | 0.000474 | 0.000040 |   0.000033 |                 1 |                   0 |            8 |             0 |             0 |                 0 |                 1 |                 1 |     0 | open_tables           | sql_base.cc          |        5715 |
| init                 | 0.000043 | 0.000023 |   0.000020 |                 0 |                   0 |            0 |             0 |             0 |                 0 |                 0 |                 0 |     0 | handle_query          | sql_select.cc        |         121 |
| System lock          | 0.000811 | 0.000046 |   0.000035 |                 2 |                   0 |           16 |             0 |             0 |                 0 |                 2 |                 2 |     0 | mysql_lock_tables     | lock.cc              |         323 |
| optimizing           | 0.000474 | 0.000027 |   0.000023 |                 1 |                   0 |            8 |             0 |             0 |                 0 |                 1 |                 1 |     0 | optimize              | sql_optimizer.cc     |         151 |
| statistics           | 0.000027 | 0.000014 |   0.000012 |                 0 |                   0 |            0 |             0 |             0 |                 0 |                 0 |                 0 |     0 | optimize              | sql_optimizer.cc     |         367 |
| preparing            | 0.000763 | 0.000044 |   0.000036 |                 2 |                   0 |           16 |             0 |             0 |                 0 |                 2 |                 2 |     0 | optimize              | sql_optimizer.cc     |         475 |
| executing            | 0.000007 | 0.000003 |   0.000003 |                 0 |                   0 |            0 |             0 |             0 |                 0 |                 0 |                 0 |     0 | exec                  | sql_executor.cc      |         119 |
| Sending data         | 0.000103 | 0.000057 |   0.000046 |                 0 |                   0 |            0 |             0 |             0 |                 0 |                 0 |                 0 |     0 | exec                  | sql_executor.cc      |         195 |
| end                  | 0.001408 | 0.000062 |   0.000050 |                 1 |                   0 |          248 |             0 |             0 |                 0 |                 1 |                 0 |     0 | handle_query          | sql_select.cc        |         199 |
| query end            | 0.000378 | 0.000029 |   0.000022 |                 1 |                   0 |            8 |             0 |             0 |                 0 |                 1 |                 1 |     0 | mysql_execute_command | sql_parse.cc         |        4946 |
| closing tables       | 0.000409 | 0.000022 |   0.000020 |                 1 |                   0 |            8 |             0 |             0 |                 0 |                 1 |                 1 |     0 | mysql_execute_command | sql_parse.cc         |        4998 |
| freeing items        | 0.000030 | 0.000017 |   0.000012 |                 0 |                   0 |            0 |             0 |             0 |                 0 |                 0 |                 0 |     0 | mysql_parse           | sql_parse.cc         |        5610 |
| cleaning up          | 0.000026 | 0.000014 |   0.000012 |                 0 |                   0 |            0 |             0 |             0 |                 0 |                 0 |                 0 |     0 | dispatch_command      | sql_parse.cc         |        1924 |
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+-----------------------+----------------------+-------------+
15 rows in set, 1 warning (0.00 sec)

mysql> 
...