The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Базы данных, SQL" / Оглавление документа

Часть 2. Конкурентные запросы.

Глава 6. Взаимные блокировки.

В предыдущей части мы рассмотрели каким образом можно найти причину проблемы, если она повторяется всегда. Но бывают случаи, когда проблема возникает только при определённом стечении обстоятельств.

Например, такой простой запрос может выполняться достаточно долго:

mysql> select * from t;
+-----+
| a   |
+-----+
|   0 |
| 256 |
+-----+
2 rows in set (3 min 18.71 sec)

Чаще всего вы обнаруживаете неожиданно медленный запрос в slow query log. В данном случае смущает количество строк в результате.

Может быть это какая-то сложная таблица с множеством индексов? Хотя это не должно играть роли в данном случае.

Нет:

mysql> show create table t\G
************** 1. row **************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`a`)
) ENGINE=MyISAM AUTO_INCREMENT=257 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

Попробуем тоже самое проделать в консоли:

mysql> select * from t;
+-----+
| a   |
+-----+
|   0 |
| 256 |
+-----+
2 rows in set (0.00 sec)

0 секунд!

В чём же дело? Здесь наш главный помощник - команда SHOW PROCESSLIST:

mysql> show processlist\G
******************* 1. row *******************
     Id: 1311
   User: root
   Host: localhost
     db: test
Command: Query
   Time: 35
  State: Locked
   Info: select * from t
******************* 2. row *******************
     Id: 1312
   User: root
   Host: localhost
     db: test
Command: Query
   Time: 36
  State: User sleep
   Info: update t set a=sleep(200) where a=0
******************* 3. row ******************
     Id: 1314
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
3 rows in set (0.00 sec)

В результате мы сразу видим, что интересующий нас запрос ждёт когда будет выполнен другой, требующий большего времени.

Что делать? На уровне приложения разводить запросы по времени: не давать им выполняться одновременно.

Приём 11: используйте SHOW PROCESSLIST чтобы посмотреть список одновременно выполняемых запросов.

Начиная с версии 5.1 INFORMATION_SCHEMA содержит таблицу PROCESSLIST. Вы также можете использовать эту таблицу чтобы посмотреть список запущенных процессов.

mysql> SELECT * FROM PROCESSLIST\G
*************************** 1. row ***************************
     ID: 955
   USER: root
   HOST: localhost
     DB: information_schema
COMMAND: Query
   TIME: 0
  STATE: executing
   INFO: SELECT * FROM PROCESSLIST
1 row in set (0.01 sec)

Это особенно удобно, если у вас одновременно выполняется много запросов и вы хотите отсортировать вывод.

Приём 12: используйте таблицу INFORMATION_SCHEMA.PROCESSLIST если вам нужен отсортированный по какому-либо параметру список одновременных запросов.

Назад Содержание Вперёд

Автор 2009 Света Смирнова
COPYRIGHT © 2009 С.Смирнова и С.Ласунов
sveta_гав_js-client_точка_com




Спонсоры:
Слёрм
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру