ตัวแปรสถานะ MySQL Handler_read_rnd_next กำลังเติบโตขึ้นอย่างมาก


11

ในสถานะ MYSQL ค่า Handler_read_rnd_next นั้นสูงมาก

ฉันทราบว่าค่านี้จะเพิ่มขึ้นเมื่อดำเนินการแบบสอบถามซึ่งไม่มีดัชนีที่เหมาะสม

แต่แม้ว่าเราจะเรียกใช้สถานะการแสดงเช่น 'Handler_read_rnd_next' ค่านี้จะเพิ่มขึ้น 2

จากการตั้งค่าสถานะนี้เรากำลังตรวจสอบสถานะบางอย่าง

ดังนั้นทุกครั้งสถิตินี้จึงมีความสำคัญ

เราสามารถแยกการดำเนินการ 'show' เหล่านี้ออกจากการนับ 'Handler_read_rnd_next'

อีกหนึ่งตัวอย่างสำหรับสิ่งนี้

มีตารางที่มี 10 แถวตารางจะถูกจัดทำดัชนีในคอลัมน์ 'data' และหากเราประมวลผลแบบสอบถามต่อไปนี้:

select data from test where data = 'vwx' -> returns one row

และถ้าเราตรวจสอบค่าของ 'Handler_read_rnd_next' มันจะเพิ่มขึ้น 7

ต่อไปนี้เป็นผลลัพธ์ของคำสั่งอธิบายสำหรับแบบสอบถามด้านบน:

explain select data from test where data = 'vwx';

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra

1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'

มีวิธีใดบ้างที่จะ จำกัด ค่านี้หรือฉันจะรู้ได้ไหมว่าทำไมค่านี้ถึงเพิ่มขึ้นอย่างรวดเร็ว


นี่เป็นสาเหตุที่ทำให้เกิดปัญหาด้านประสิทธิภาพหรือไม่
Aaron Brown

ไม่มีประสิทธิภาพไม่ได้รับผลกระทบ แต่เครื่องมือตรวจสอบกำลังตรวจสอบการตั้งค่าสถานะนี้และแสดงผลที่สำคัญ
Phanindra

หากประสิทธิภาพไม่ใช่ปัญหาให้แก้ไขเครื่องมือการตรวจสอบแทน
แอรอนบราวน์

ฉันได้ตรวจสอบกับเครื่องมืออื่น ๆ เช่นกัน (Monyog) ก็มีปัญหาเดียวกัน
Phanindra

แล้วไงล่ะ ไม่ต้องสนใจหากไม่ได้ทำให้เกิดปัญหาประสิทธิภาพ มันเป็นเพียงเคาน์เตอร์
Aaron Brown

คำตอบ:


5

ก่อนอื่นเรามาดูนิยามของ Handler_read_rnd_next

ตามเอกสาร MySQLใน Handler_read_rnd_next:

จำนวนคำขอที่จะอ่านแถวถัดไปในไฟล์ข้อมูล ค่านี้สูงถ้าคุณทำการสแกนตารางจำนวนมาก โดยทั่วไปสิ่งนี้ชี้ให้เห็นว่าตารางของคุณไม่ได้รับการจัดทำดัชนีอย่างเหมาะสมหรือไม่ได้เขียนแบบสอบถามของคุณเพื่อใช้ประโยชน์จากดัชนีที่คุณมี

ตอนนี้ดูคำถามของคุณ:

select data from test where data = 'vwx';

คุณพูดว่าตารางมี 10 แถว ตามกฎง่ายๆ MySQL Query Optimizer จะยกเลิกการใช้ดัชนีหากจำนวนแถวที่ต้องตรวจสอบมีค่ามากกว่า 5% ของจำนวนแถวทั้งหมด

ให้เราทำคณิตศาสตร์ 5% ของ 10 แถวคือ 0.5 แถว แม้ว่าจำนวนแถวที่ต้องการค้นหาข้อมูลของคุณคือ 1 นั่นคือมากกว่า 0.5 จากจำนวนแถวที่น้อยกว่านี้และกฎดัชนีที่ฉันเพิ่งพูดถึงเครื่องมือเพิ่มประสิทธิภาพการสืบค้น MySQL จะทำการสแกนตารางเสมอ

เนื่องจากคอลัมน์dataเป็นดัชนีของตัวเองแทนที่จะสแกนตาราง mysql จึงทำการสแกนดัชนี

หากคุณทราบแน่ชัดว่าตารางทดสอบจะไม่มีวันเติบโตคุณสามารถลบดัชนีทั้งหมดและปล่อยให้การสแกนตารางเกิดขึ้น ตัวแปรสถานะตัวจัดการควรหยุดการเพิ่ม


สวัสดีขอบคุณสำหรับการตอบกลับ ฉันลองโดยลบดัชนีและตรวจสอบค่าโดยดำเนินการค้นหา แต่ค่าของ Handler_read_rnd_next จะเพิ่มขึ้น 18 ซึ่งเพิ่มขึ้น 7 ด้วยดัชนี ตารางที่ฉันพูดถึงไม่คงที่ นั่นคือตัวอย่างฉันใส่ 70 แถวเพิ่มเติมลงในตารางดังนั้นจำนวนแถวทั้งหมดคือ 80 และดำเนินการสืบค้นเดียวกันกับดัชนีในคอลัมน์ 'data' ซึ่งยังคงส่งคืนเพียงแถวเดียว แต่เมื่อฉันตรวจสอบค่าของ 'Handler_read_rnd_next' มันยังคงเพิ่มขึ้นอีก 7 ฉันจะรู้ได้ไหมว่าสาเหตุที่การตั้งค่าสถานะนี้เพิ่มขึ้นและวิธี จำกัด สิ่งนี้
Phanindra

ด้วยเหตุผลเดียวกันกับที่ฉันให้ไว้ ทำการสแกนดัชนี เวลานี้ไม่จำเป็นต้องใช้ดัชนีแบบเต็ม เห็นได้ชัดว่าโหนดใบไม้ 7 โหนดใน BTREE ของดัชนีต้องถูกสำรวจเพื่อให้ได้แถวเดียว ตัวนับสถานะตัวจัดการเปิดเผยการใช้ดัชนี วิธีเดียวที่จะ จำกัด คือการลบดัชนีทั้งหมดตามที่ฉันระบุ มิฉะนั้นจะเกิดพฤติกรรมที่คาดหวังเสมอ indexeing ที่ดีขึ้นของโครงสร้างตารางที่ซับซ้อนมากขึ้นและแบบสอบถามที่ออกแบบมาอย่างเหมาะสมสามารถลดจำนวนตัวจัดการ แต่ไม่สามารถลบออกได้อย่างสมบูรณ์
RolandoMySQLDBA

"ตามกฎทั่วไปเครื่องมือเพิ่มประสิทธิภาพการสืบค้น MySQL จะยกเลิกการใช้ดัชนีหากจำนวนแถวที่ต้องตรวจสอบมีค่ามากกว่า 5% ของจำนวนแถวทั้งหมด" - สิ่งนี้เป็นประโยชน์อย่างมากที่จะรู้ มีเอกสารอย่างเป็นทางการที่สนับสนุนสิ่งนี้หรือไม่? ขอบคุณมาก!
itoctopus

2

MySQL รุ่นใด

สาเหตุที่ทำให้ค่าสถานะนี้เพิ่มขึ้นเป็นเอกสารที่ดีที่สุดที่นี่: http://www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/

กล่าวโดยสรุปก็คือตัวนับจำนวนแถวที่เรียกตามลำดับในระหว่างการสแกนตารางเต็มหรือบางส่วน

ตอนนี้ที่กล่าวว่าฉันได้รับผลที่แตกต่าง:

mysql> CREATE TABLE `test` (
    ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `data` varchar(255) NOT NULL,
    ->   PRIMARY KEY (`id`),
    ->   KEY `data` (`data`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.27 sec)

mysql> INSERT INTO test (data) VALUES ('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('g'), ('h'), ('i'), ('vwx');
Query OK, 10 rows affected (0.06 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> FLUSH STATUS;
Query OK, 0 rows affected (0.07 sec)

mysql> select data from test where data = 'vwx';
+------+
| data |
+------+
| vwx  |
+------+
1 row in set (0.04 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         | 0     |
| Handler_read_key           | 3     |
| Handler_read_last          | 0     |
| Handler_read_next          | 1     |
| 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     |
+----------------------------+-------+
16 rows in set (0.15 sec)

0

หากมีดัชนีเฉพาะ / หลักในคอลัมน์ "data" แสดงว่าคุณได้ทำการปรับให้เหมาะสมสำหรับแบบสอบถามนี้แล้ว ฉันไม่คิดว่าจะสามารถเพิ่มประสิทธิภาพได้อีกในเรื่องนี้

นอกจากนี้คุณสามารถตรวจสอบว่ามีการสแกนแบบเต็มตารางหรือไม่?

SHOW STATUS like 'select_scan'; 
SELECT data from test where data='vmx';
SHOW STATUS like 'select_scan'; 

ตรวจสอบให้แน่ใจว่า select_scan ยังไม่เพิ่มค่ามันด้วยวิธีนี้คุณสามารถตรวจสอบว่าการสแกนแบบเต็มตารางเสร็จสิ้นหรือไม่คุณควรลองเพิ่มประสิทธิภาพการสืบค้นที่จะไม่ทำการสแกนตารางแบบเต็ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.