Đối với truy vấn MySQL, làm thế nào để bạn xác định I / O vật lý và logic?


7

Tôi đã từng có một chương trình giới thiệu trong Microsoft SQL và đã trở nên lười biếng với việc sử dụng các công cụ để điều chỉnh các truy vấn MySQL. Làm cách nào tôi có thể xác định I / O vật lý / logic cho truy vấn trong MySQL? (EXPLAIN hiển thị lựa chọn chỉ mục nhưng tôi muốn biết thêm thông tin từ máy chủ MySQL, nếu có thể).


2
Tôi đoán bạn đã thấy điều này trên SO? nó có giúp gì không stackoverflow.com/questions/124925/ Khăn Nếu không, tại sao không?
jcolebrand

Không hẳn là câu hỏi của bạn, nhưng bạn có thể thích bài đăng trên blog này: tocker.ca/2013/05/06/when-does-mysql-perform-io.html
Morgan Tocker

Câu trả lời:


6

Tôi khuyên bạn nên sử dụng Percona Server, để cải tiến nhật ký truy vấn chậm. Tôi đã trả lời một chủ đề tương tự như vậy trên Stack Overflow:

/programming/3393206/what-is-the-equivalent-query-in-mysql/3443944#3443944

Hãy xem cụ thể điều này (từ http://www.percona.com/docs/wiki/percona-server:features:slow_extends?redirect=1#changes_to_the_log_format ):

# User@Host: mailboxer[mailboxer] @  [192.168.10.165]
# Thread_id: 11167745  Schema: board
# QC_Hit: No  Full_scan: No  Full_join: No  Tmp_table: Yes  Disk_tmp_table: No
# Filesort: Yes  Disk_filesort: No  Merge_passes: 0
# Query_time: 0.000659  Lock_time: 0.000070  Rows_sent: 0  Rows_examined: 30  Rows_affected: 0  Rows_read: 30
#   InnoDB_IO_r_ops: 1  InnoDB_IO_r_bytes: 16384  InnoDB_IO_r_wait: 0.028487
#   InnoDB_rec_lock_wait: 0.000000  InnoDB_queue_wait: 0.000000
#   InnoDB_pages_distinct: 5
select count(distinct author_id) from art87.article87 force index (forum_id) where forum_id = 240215 and thread_id = '710575' 

4

Bạn có thể ước tính hiệu suất truy vấn bằng cách xem số lượng tìm kiếm đĩa.

Phần Tối ưu hóa của hướng dẫn sử dụng MySQL giải thích một trong những cách hữu ích hơn để ước tính I / O và các yêu cầu điều chỉnh tiếp theo. Khám phá số lần đọc và ước tính IO phần cứng sẽ cho bạn một dấu hiệu khá rõ ràng về các yêu cầu truy cập đĩa. Hơn nữa, bằng cách điều chỉnh kích thước bộ đệm, bạn sẽ có thể thấy hàm ý của bộ nhớ và bộ nhớ đệm trên truy vấn của bạn.


3

Nó không hoàn hảo, nhưng bạn sẽ có thể làm được

mysql> show variables where variable_name like '%innodb%';

Đối với số lần đọc vật lý, hãy nhìn vào bộ Innodb_buffer_pool_readsđếm và để đọc logic Innodb_buffer_pool_read_requests. Để hữu ích, bạn cần ghi lại những con số này, sau đó chạy một khối lượng công việc đại diện, sau đó chia số lần đọc logic để tìm đọc logic cho mỗi truy vấn. Nếu bạn may mắn, số lần đọc vật lý sẽ tăng lên gần khi bắt đầu chạy thử và sau đó không đổi.


Hữu ích nhưng lưu ý rằng đây là toàn cầu: Nếu bạn học một tuyên bố, bạn nên ở một mình. Ngoài ra, đôi khi sẽ gây hiểu lầm nếu bạn đọc lại nhiều lần trong cùng một khối, nó được tính là đọc logic mỗi lần (ví dụ: tham gia 1000 hàng trên 1 hàng => 1000 lần đọc logic, mặc dù toàn bộ có lẽ là 100 khối) sử dụng điều này để phát hiện một số SQL nặng mặc dù ...
phil_w

1

Với một số công việc, bạn có thể thấy "công việc" truy vấn của bạn mất bao nhiêu.

mysql> FLUSH STATUS;           -- In newer MySQLs, this clears the "SESSION" values
Query OK, 0 rows affected (0.00 sec)    

mysql> SHOW SESSION STATUS LIKE 'Handler%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 0     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 0     |
| Handler_read_key           | 0     |
| Handler_read_next          | 0     |
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 0     |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 0     |
+----------------------------+-------+
15 rows in set (0.00 sec)

mysql> SELECT * FROM ts;
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  1 | 2011-03-24 20:47:38 |
|  2 | 2011-03-24 20:46:29 |
|  3 | 2011-03-24 20:46:43 |
+----+---------------------+
3 rows in set (0.00 sec)

mysql> SHOW SESSION STATUS LIKE 'Handler%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 1     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 1     |
| Handler_read_key           | 2     |
| Handler_read_next          | 0     |
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 4     |  <-- 3 rows, plus 1 to realize it is finished
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 0     |
+----------------------------+-------+
15 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE 'Up%';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| Uptime                    | 3287334 |
| Uptime_since_flush_status | 68      |
+---------------------------+---------+
2 rows in set (0.00 sec)

Chà, điều đó không cung cấp cho bạn các câu trả lời được lưu trong bộ nhớ cache và không được lưu trong bộ nhớ cache, nhưng nó cung cấp cho bạn một số manh mối thú vị.

Than ôi, TÌNH TRẠNG InnoDB là toàn cầu. Vì vậy, bạn cần phải nắm bắt chúng trước và sau. Tệ hơn nữa, các truy vấn khác cũng sẽ bị trả lại các giá trị.

mysql> SHOW SESSION STATUS LIKE 'Innodb_buffer_pool%';
+---------------------------------------+-------------+
| Variable_name                         | Value       |
+---------------------------------------+-------------+
| Innodb_buffer_pool_pages_data         | 279861      |
| Innodb_buffer_pool_pages_dirty        | 52          |
| Innodb_buffer_pool_pages_flushed      | 15992658    |
| Innodb_buffer_pool_pages_free         | 96          |
| Innodb_buffer_pool_pages_misc         | 8043        |
| Innodb_buffer_pool_pages_total        | 288000      |
| Innodb_buffer_pool_read_ahead         | 2567477     |
| Innodb_buffer_pool_read_ahead_evicted | 262237      |
| Innodb_buffer_pool_read_requests      | 26565709230 |
| Innodb_buffer_pool_reads              | 1339717     |
| Innodb_buffer_pool_wait_free          | 0           |
| Innodb_buffer_pool_write_requests     | 865548882   |
+---------------------------------------+-------------+
12 rows in set (0.00 sec)

mysql> SELECT * FROM ts;
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  1 | 2011-03-24 20:47:38 |
|  2 | 2011-03-24 20:46:29 |
|  3 | 2011-03-24 20:46:43 |
+----+---------------------+
3 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE 'Innodb_buffer_pool%';
+---------------------------------------+-------------+
| Variable_name                         | Value       |
+---------------------------------------+-------------+
| Innodb_buffer_pool_pages_data         | 279865      |
| Innodb_buffer_pool_pages_dirty        | 8           |
| Innodb_buffer_pool_pages_flushed      | 15992842    |
| Innodb_buffer_pool_pages_free         | 92          |
| Innodb_buffer_pool_pages_misc         | 8043        |
| Innodb_buffer_pool_pages_total        | 288000      |
| Innodb_buffer_pool_read_ahead         | 2567477     |
| Innodb_buffer_pool_read_ahead_evicted | 262237      |
| Innodb_buffer_pool_read_requests      | 26565712655 |  <-- This went up
| Innodb_buffer_pool_reads              | 1339717     |  <-- No chg = no disk reads
| Innodb_buffer_pool_wait_free          | 0           |
| Innodb_buffer_pool_write_requests     | 865550805   |
+---------------------------------------+-------------+
12 rows in set (0.00 sec)

Câu thần chú của tôi "Đếm số lần truy cập đĩa".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.