Какво е профил в MySQL и с какво може да ни помогне

Профил е един вид възможност да записвате вашите заявки от конкретен момент и след това да ги изследвате по- подробно. Благодарение на този метод може да видите резултата от оптимизацията(+ explain). С профил може да проследите по- подробно една заявка какво процесорно време ползва, памет и дооооста други неща 🙂

Ето един пример как работи. Изполваме базата „test“ където създаваме таблица „t1“ и процедура „dh_profile“ с която да я напълним.

use test;

drop table t1;
CREATE TABLE `t1` (
`id` int(11) NOT NULL auto_increment,
`weight` int(11) NOT NULL,
`query` varchar(3072) NOT NULL,
`ddate` date NOT NULL,
PRIMARY KEY  (`id`),
KEY `query` (`query`)
) ENGINE=MyISAM;

delimiter $$
CREATE PROCEDURE dh_profile()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE (i<=100000) DO
insert into t1 (weight,query,ddate) VALUES („1″,“Mysql rulz +{:>>“,CURDATE());
SET i=i+1;
END WHILE;
END$$
delimiter ;

Пълним таблицата t1

mysql> call dh_profile();
Query OK, 1 row affected (37.06 sec)

Проверяваме дали профилирането е пуснато

mysql> SELECT @@profiling;
+––––-+
| @@profiling |
+––––-+
|           0 |
+––––-+
1 row in set (0.00 sec)

Пускаме профилиране

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

Изпълняваме малка натоварваща заявка която по – долу ще разгледам по- обстойно

mysql> select query from t1 order by rand() limit 10;
+––––––+
| query            |
+––––––+
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
| Mysql rulz +{:>> |
+––––––+
10 rows in set (5.10 sec)

Извеждаме какво е записано в профила ни

mysql> SHOW PROFILES;
+–––-+––––+––––––––––––––––+
| Query_ID | Duration   | Query                                         |
+–––-+––––+––––––––––––––––+
|        1 | 6.50790900 | select query from t1 order by rand() limit 10 |
+–––-+––––+––––––––––––––––+
1 row in set (0.00 sec)

Информация по стъпки за заявка 1

mysql> SHOW PROFILE FOR QUERY 1;
+–––––––––––+–––-+
| Status                         | Duration |
+–––––––––––+–––-+
| (initialization)               | 0.000003 |
| checking query cache for query | 0.000021 |
| Opening tables                 | 0.000005 |
| System lock                    | 0.000003 |
| Table lock                     | 0.000004 |
| init                           | 0.000008 |
| optimizing                     | 0.000002 |
| statistics                     | 0.000007 |
| preparing                      | 0.000007 |
| Creating tmp table             | 0.000027 |
| executing                      | 0.000003 |
| Copying to tmp table           | 0.017907 |
| converting HEAP to MyISAM      | 0.049151 |
| Copying to tmp table on disk   | 4.75879  |
| Sorting result                 | 0.268406 |
| Sending data                   | 0.000364 |
| end                            | 0.000004 |
| removing tmp table             | 1.413161 |
| end                            | 0.000014 |
| query end                      | 0.000005 |
| freeing items                  | 0.000009 |
| closing tables                 | 0.000006 |
| logging slow query             | 0.000002 |
+–––––––––––+–––-+
23 rows in set (0.01 sec)

Извеждане на всички стъпки при заявка 1 + тяхното CPU натоварване

mysql> SHOW PROFILE CPU FOR QUERY 1;
+–––––––––––+–––-+–––-+––––+
| Status                         | Duration | CPU_user | CPU_system |
+–––––––––––+–––-+–––-+––––+
| (initialization)               | 0.000003 | 0        | 0          |
| checking query cache for query | 0.000021 | 0        | 0          |
| Opening tables                 | 0.000005 | 0        | 0          |
| System lock                    | 0.000003 | 0        | 0          |
| Table lock                     | 0.000004 | 0        | 0          |
| init                           | 0.000008 | 0        | 0          |
| optimizing                     | 0.000002 | 0        | 0          |
| statistics                     | 0.000007 | 0        | 0          |
| preparing                      | 0.000007 | 0        | 0          |
| Creating tmp table             | 0.000027 | 0        | 0          |
| executing                      | 0.000003 | 0        | 0          |
| Copying to tmp table           | 0.017907 | 0.016001 | 0          |
| converting HEAP to MyISAM      | 0.049151 | 0.024001 | 0.028001   |
| Copying to tmp table on disk   | 4.75879  | 0.260017 | 0.644041   |
| Sorting result                 | 0.268406 | 0.17201  | 0.0960059  |
| Sending data                   | 0.000364 | 0        | 0.004      |
| end                            | 0.000004 | 0        | 0          |
| removing tmp table             | 1.413161 | 0        | 0.088005   |
| end                            | 0.000014 | 0        | 0          |
| query end                      | 0.000005 | 0        | 0          |
| freeing items                  | 0.000009 | 0        | 0          |
| closing tables                 | 0.000006 | 0        | 0          |
| logging slow query             | 0.000002 | 0        | 0          |
+–––––––––––+–––-+–––-+––––+
23 rows in set (0.00 sec)

Извеждане на всички стъпки при заявка 1 + натоварването в паметта

mysql> SHOW PROFILE MEMORY FOR QUERY 1;
+–––––––––––+–––-+
| Status                         | Duration |
+–––––––––––+–––-+
| (initialization)               | 0.000003 |
| checking query cache for query | 0.000021 |
| Opening tables                 | 0.000005 |
| System lock                    | 0.000003 |
| Table lock                     | 0.000004 |
| init                           | 0.000008 |
| optimizing                     | 0.000002 |
| statistics                     | 0.000007 |
| preparing                      | 0.000007 |
| Creating tmp table             | 0.000027 |
| executing                      | 0.000003 |
| Copying to tmp table           | 0.017907 |
| converting HEAP to MyISAM      | 0.049151 |
| Copying to tmp table on disk   | 4.75879  |
| Sorting result                 | 0.268406 |
| Sending data                   | 0.000364 |
| end                            | 0.000004 |
| removing tmp table             | 1.413161 |
| end                            | 0.000014 |
| query end                      | 0.000005 |
| freeing items                  | 0.000009 |
| closing tables                 | 0.000006 |
| logging slow query             | 0.000002 |
+–––––––––––+–––-+
23 rows in set (0.00 sec)

PS: Надявам се публикацията бъде полезни на всеки MySQL оптимизатор. Успех!

Категория:

2 отговора

  1. Аватарът на Марто

    Не че съм особен фен на готовите решения, но се чудя защо не използваш phpmyadmin? Там профилирането е по-шаренко някак си 🙂

    п.с. добави известяване за нови коментари:)

    1. Аватарът на Мартин Петров

      За толкова години съм ползвал 1-2 пъти phpMyAdmin и то заради приятели. Не съм фен на GUI решенията и затова ползвам само терминал когато правя нещо, но това си е личен избор. Мога да потвърдя, че phpMyAdmin може да спести време в доста отношения, но дали съм мазохист или не незнам. Просто не харесвам phpMyAdmin.

Logged in as {{omniform_current_user_display_name}}. Edit your profile. Log out? Required fields are marked *

Your email address will not be published. Required fields are marked *

Comments are closed.

You must be logged in to post a comment.