| |
В предыдущей части мы рассмотрели каким образом можно найти причину проблемы, если она повторяется всегда. Но бывают случаи, когда проблема возникает только при определённом стечении обстоятельств.
Например, такой простой запрос может выполняться достаточно долго:
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 |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |