Score:0

MySQL - เลือกการสืบค้นช้าลง 10 เท่าบน Azure VM เทียบกับ VM ภายในองค์กร

ธง cn

เรากำลังดำเนินการโครงการเพื่อย้ายฐานข้อมูล MySQL จากเซิร์ฟเวอร์ Linux ภายในองค์กรไปยัง Windows VM บน Azure (IaaS) (มีเหตุผลเฉพาะเนื่องจากเราได้ใช้ตัวเลือก IaaS แทนข้อเสนอ Azure MySQL PaaS)

หลังจากการย้ายข้อมูล เราพบว่าข้อความค้นหาในฐานข้อมูล MySQL ช้าลงอย่างมาก (ประมาณ 10 เท่า) บนเซิร์ฟเวอร์ใหม่ VM ได้รับการกำหนดค่าด้วย 64 CPU และ 256 GB RAM (VM ภายในองค์กรมี 48 CPU และ 256 GB RAM)

ตารางทั้งหมดในฐานข้อมูลกำลังใช้เครื่องมือ InnoDB เราได้อ่านมามากพอสมควรเกี่ยวกับความช้าของคิวรีด้วยตาราง InnoDB และดูเหมือนว่าส่วนใหญ่จะชี้ไปที่ innodb_buffer_pool_size ซึ่งฉันได้กำหนดค่าเป็น 185 GB แล้ว (ประมาณ 70% ของ RAM ทั้งหมด) เราได้ลองทำการเปลี่ยนแปลงอื่นๆ อีกหลายอย่างใน my.ini การกำหนดค่าเช่น

key_buffer_size = 20MB
innodb_io_capacity = 2,000
query_cache_size = 0
query_cache_type = 0
เพิ่ม thread_cache_size
innodb_read_io_threads
innodb_write_io_threads

ฯลฯ แต่ดูเหมือนว่าจะไม่มีอะไรช่วยได้กับประสิทธิภาพการค้นหา

เราได้เปรียบเทียบดัชนีบนเซิร์ฟเวอร์ทั้งสองและเหมือนกัน และในระดับสูง ดูเหมือนว่าดัชนีจะใช้งานไม่ได้บน Azure VM นอกจากนี้ เรากำลังพยายามวัดประสิทธิภาพด้วยการเรียกใช้ MySQL workbench ภายใน Azure VM ดังนั้นแบนด์วิธของเครือข่ายจึงไม่ควรเป็นปัญหา

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

อีกสองสามจุด

  • สิ่งที่เราสังเกตเห็นคือแม้ว่าบางคำถามจะใช้เวลา 30+ นาที เพื่อเรียกใช้ (ดูเหมือนว่าจะทำงานในเซิร์ฟเวอร์ภายในองค์กรในเวลาเพียง 5 นาที) การใช้งาน CPU บน VM ยังคงต่ำมาก (น้อยกว่า 10%)มีการตั้งค่าบางอย่างเช่น innodb_buffer_pool_size` เพื่อจัดสรร CPU จำนวนหนึ่งให้กับเซิร์ฟเวอร์ MySQL หรือไม่

อย่างที่ฉันได้กล่าวไปก่อนหน้านี้ VM ในองค์กรนั้นใช้ Linux และ Azure VM กำลังทำงานบน Windows - นั่นอาจเป็นปัญหาหรือไม่ ฉันไม่พบข้อพิสูจน์ที่แน่ชัดว่า MySQL บน Windows จะทำให้ประสิทธิภาพลดลงอย่างมาก

การกำหนดค่า my.ini แบบเต็มของฉันอยู่ด้านล่าง:

# ค่าปรับแต่งเริ่มต้นอื่น ๆ
# ไฟล์กำหนดค่าอินสแตนซ์ของเซิร์ฟเวอร์ MySQL
# --------------------------------------------- ---------------------
# สร้างโดยตัวช่วยสร้างการกำหนดค่าอินสแตนซ์ของเซิร์ฟเวอร์ MySQL
#
#
# คำแนะนำในการติดตั้ง
# --------------------------------------------- ---------------------
#
# บน Linux คุณสามารถคัดลอกไฟล์นี้ไปที่ /etc/my.cnf เพื่อตั้งค่าตัวเลือกส่วนกลาง
# mysql-data-dir/my.cnf เพื่อตั้งค่าตัวเลือกเฉพาะเซิร์ฟเวอร์
# (@localstatedir@ สำหรับการติดตั้งนี้) หรือถึง
# ~/.my.cnf เพื่อตั้งค่าตัวเลือกเฉพาะผู้ใช้
#
# บน Windows คุณควรเก็บไฟล์นี้ไว้ในไดเร็กทอรีการติดตั้ง 
# เซิร์ฟเวอร์ของคุณ (เช่น C:\Program Files\MySQL\MySQL Server XY) ถึง
# ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์อ่านไฟล์กำหนดค่าโดยใช้ตัวเลือกการเริ่มต้น 
# "--ไฟล์เริ่มต้น". 
#
# หากต้องการเรียกใช้เซิร์ฟเวอร์จากบรรทัดคำสั่ง ให้ดำเนินการในไฟล์ 
# เชลล์บรรทัดคำสั่งเช่น
# mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server XY\my.ini"
#
# หากต้องการติดตั้งเซิร์ฟเวอร์เป็นบริการ Windows ด้วยตนเอง ให้ดำเนินการนี้ใน 
# เชลล์บรรทัดคำสั่งเช่น
# mysqld -- ติดตั้ง MySQLXY --defaults-file="C:\Program Files\MySQL\MySQL Server XY\my.ini"
#
# จากนั้นดำเนินการนี้ในเชลล์บรรทัดคำสั่งเพื่อเริ่มเซิร์ฟเวอร์เช่น
# เริ่มต้นสุทธิ MySQLXY
#
#
#คำแนะนำในการแก้ไขไฟล์นี้
# --------------------------------------------- ---------------------
#
# ในไฟล์นี้ คุณสามารถใช้ตัวเลือกแบบยาวทั้งหมดที่โปรแกรมรองรับได้
# หากคุณต้องการทราบตัวเลือกที่โปรแกรมรองรับ ให้เริ่มโปรแกรม
# ด้วยตัวเลือก "--help"
#
# ข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับแต่ละตัวเลือกยังสามารถ
#ดูได้จากคู่มือ
#
# สำหรับคำแนะนำเกี่ยวกับวิธีเปลี่ยนการตั้งค่าโปรดดู
# https://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
#
#
#ส่วนลูกค้า
# --------------------------------------------- ---------------------
#
# ตัวเลือกต่อไปนี้จะถูกอ่านโดยแอปพลิเคชันไคลเอนต์ MySQL
# โปรดทราบว่ารับประกันเฉพาะแอปพลิเคชันไคลเอนต์ที่จัดส่งโดย MySQL เท่านั้น
#เพื่ออ่านส่วนนี้ หากคุณต้องการโปรแกรมไคลเอนต์ MySQL ของคุณเอง
# ให้เกียรติค่าเหล่านี้ คุณต้องระบุเป็นตัวเลือกระหว่าง
# การเริ่มต้นไลบรารีไคลเอนต์ MySQL
#
[ลูกค้า]

#ท่อ=

# ซ็อกเก็ต = MYSQL

พอร์ต = 3306

[มายเอสคิวแอล]
ไม่มีเสียงบี๊บ

# ชุดอักขระเริ่มต้น =

#ส่วนเซิฟเวอร์
# --------------------------------------------- ---------------------
#
# ตัวเลือกต่อไปนี้จะถูกอ่านโดยเซิร์ฟเวอร์ MySQL ทำให้เเน่นอน
# คุณได้ติดตั้งเซิร์ฟเวอร์อย่างถูกต้อง (ดูด้านบน) ดังนั้นจึงอ่านสิ่งนี้ 
# ไฟล์.
#
# server_type=1
[มายเอสคิวลด์]
plugin-load-add=validate_password.dll
ตรวจสอบรหัสผ่าน=FORCE_PLUS_PERMANENT
# สามตัวเลือกถัดไปเป็นของ SERVER_PORT ด้านล่าง
#ข้ามเครือข่าย
# เปิดใช้งานชื่อท่อ
#หน่วยความจำที่ใช้ร่วมกัน

# หน่วยความจำที่ใช้ร่วมกันชื่อฐาน = MYSQL

# ท่อที่เซิร์ฟเวอร์ MySQL จะใช้
# ซ็อกเก็ต = MYSQL

# พอร์ต TCP/IP ที่เซิร์ฟเวอร์ MySQL จะรับฟัง
พอร์ต = 3306

# เส้นทางไปยังไดเร็กทอรีการติดตั้ง เส้นทางทั้งหมดมักจะได้รับการแก้ไขโดยสัมพันธ์กับสิ่งนี้
# basedir="C:/ไฟล์โปรแกรม/MySQL/MySQL Server 5.7/"

# พาธไปยังรูทฐานข้อมูล
datadir=F:\MySQL\ข้อมูล

# ชุดอักขระเริ่มต้นที่จะใช้เมื่อมีสคีมาหรือตารางใหม่
# สร้างและไม่มีการกำหนดชุดอักขระ
# ชุดอักขระเซิร์ฟเวอร์ =

# เครื่องมือจัดเก็บข้อมูลเริ่มต้นที่จะใช้เมื่อสร้างตารางใหม่เมื่อ
default-storage-engine=INNODB

# ตั้งค่าโหมด SQL เป็นเข้มงวด
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# การบันทึกทั่วไปและช้า
ล็อกเอาท์พุต = FILE

บันทึกทั่วไป = 0

general_log_file="ZEUWPJIRA01.log"

แบบสอบถามช้าล็อก = 1

slow_query_log_file="ZEUWPJIRA01-slow.log"

long_query_time=10

# บันทึกข้อผิดพลาด
บันทึกข้อผิดพลาด = "ZEUWPJIRA01.err"

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ระบุชื่อฐานที่จะใช้สำหรับไฟล์บันทึกไบนารี ด้วยการบันทึกไบนารี
เปิดใช้งาน # เซิร์ฟเวอร์จะบันทึกคำสั่งทั้งหมดที่เปลี่ยนข้อมูลเป็นไบนารี
# บันทึกซึ่งใช้สำหรับการสำรองข้อมูลและการจำลองแบบ
#ล็อกอิน

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ระบุรหัสเซิร์ฟเวอร์ สำหรับเซิร์ฟเวอร์ที่ใช้ในโทโพโลยีการจำลองแบบ
# คุณต้องระบุรหัสเซิร์ฟเวอร์ที่ไม่ซ้ำกันสำหรับแต่ละเซิร์ฟเวอร์การจำลองแบบใน
# range from 1 to 2^32 â 1. âUniqueâ หมายความว่าแต่ละรหัสต้องแตกต่างกัน
# จากทุก ID อื่น ๆ ที่ใช้โดยแหล่งจำลองแบบหรือแบบจำลองอื่น ๆ
รหัสเซิร์ฟเวอร์ = 26
# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ชื่อโฮสต์หรือที่อยู่ IP ของแบบจำลองที่จะรายงานไปยังแหล่งที่มา
#ในระหว่างการลงทะเบียนจำลอง ค่านี้จะปรากฏในเอาต์พุตของ SHOW SLAVE HOSTS
#บนเซิร์ฟเวอร์ต้นทาง ปล่อยให้ค่าไม่ได้ตั้งค่าหากคุณไม่ต้องการให้จำลอง
# ลงทะเบียนตัวเองกับแหล่งที่มา
# report_host=0.0

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# กำหนดอัลกอริทึมที่ใช้ในการแฮชการเขียนที่ดึงออกมาระหว่างการทำธุรกรรม ถ้าคุณ
# กำลังใช้ Group Replication ตัวแปรนี้ต้องตั้งค่าเป็น XXHASH64 เนื่องจากกระบวนการ
# ของการแยกการเขียนจากธุรกรรมเป็นสิ่งจำเป็นสำหรับการตรวจจับความขัดแย้งทั้งหมด
# สมาชิกกลุ่ม.
#transaction_write_set_extraction=0.0
lower_case_table_names=1

# ไฟล์ส่วนตัวที่ปลอดภัย
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/อัพโหลด"

# จำนวนเซสชันพร้อมกันสูงสุดที่เซิร์ฟเวอร์ MySQL จะทำได้
# อนุญาต. หนึ่งในการเชื่อมต่อเหล่านี้จะถูกสงวนไว้สำหรับผู้ใช้ที่มี
# สิทธิ์พิเศษเพื่อให้ผู้ดูแลระบบสามารถเข้าสู่ระบบได้แม้ว่า
# ถึงขีดจำกัดการเชื่อมต่อแล้ว
#max_connections=151
#[29062021]แก้ไขโดย Sridharan เพื่อเพิ่มเซสชันพร้อมกันสูงสุด
max_connections=1,000
#[29062021]แก้ไขโดย Sridharan เพื่อเพิ่มข้อผิดพลาดในการเชื่อมต่อสูงสุด
max_connect_errors=500

# จำนวนตารางที่เปิดสำหรับเธรดทั้งหมด การเพิ่มมูลค่านี้
# เพิ่มจำนวนตัวอธิบายไฟล์ที่ mysqld ต้องการ
# ดังนั้นคุณต้องแน่ใจว่าได้กำหนดจำนวนไฟล์ที่เปิด
# อนุญาตอย่างน้อย 4096 ในตัวแปร "open-files-limit" ใน
# ส่วน [mysqld_safe]
#table_open_cache=2000
table_open_cache =2048
table_definition_cache = 2048
myisam_sort_buffer_size = 8M
#ข้ามล็อคภายนอก
# ขนาดสูงสุดสำหรับตารางชั่วคราวภายใน (ในหน่วยความจำ) ถ้าเป็นโต๊ะ
# เติบโตมากกว่าค่านี้ มันจะถูกแปลงเป็นดิสก์โดยอัตโนมัติ
# ตามตาราง ข้อจำกัดนี้สำหรับตารางเดียว สามารถมีได้มากมาย
# ของพวกเขา.
tmp_table_size=4G

# จำนวนเธรดที่เราควรเก็บไว้ในแคชเพื่อใช้ซ้ำ เมื่อลูกค้า
# ตัดการเชื่อมต่อ เธรดของไคลเอนต์จะถูกใส่ในแคชหากไม่มี
# มากกว่าเธรด thread_cache_size จากเมื่อก่อน นี้ลดลงอย่างมาก
# จำนวนการสร้างเธรดที่จำเป็นหากคุณมีเธรดใหม่จำนวนมาก
#การเชื่อมต่อ (โดยปกติแล้วสิ่งนี้ไม่ได้ให้ประสิทธิภาพที่โดดเด่น
# การปรับปรุงหากคุณมีการติดตั้งเธรดที่ดี)
# thread_cache_size=10
thread_cache_size=64
query_cache_size =0
query_cache_type = 0

#*** ตัวเลือกเฉพาะ MyISAM
# ขนาดสูงสุดของไฟล์ชั่วคราว MySQL อนุญาตให้ใช้ได้ในขณะที่
# สร้างดัชนีใหม่ (ระหว่างการซ่อมแซม แก้ไขตาราง หรือโหลดข้อมูลในไฟล์
# หากขนาดไฟล์ใหญ่กว่านี้จะจัดทำดัชนี
# ผ่านคีย์แคช (ซึ่งช้ากว่า)
myisam_max_sort_file_size=100G

# ขนาดของบัฟเฟอร์ที่จัดสรรเมื่อเรียงลำดับดัชนี MyISAM
# ระหว่าง REPAIR TABLE หรือเมื่อสร้างดัชนีด้วย CREATE INDEX
# หรือเปลี่ยนตาราง
myisam_sort_buffer_size=6G

# ขนาดของคีย์บัฟเฟอร์ ใช้เพื่อแคชบล็อคดัชนีสำหรับตาราง MyISAM
# อย่าตั้งค่าให้ใหญ่กว่า 30% ของหน่วยความจำที่มีอยู่ของคุณ เป็นหน่วยความจำบางส่วน
ระบบปฏิบัติการยังต้องการ # เพื่อแคชแถวแม้ว่าคุณจะไม่ได้ใช้
# ตาราง MyISAM คุณควรตั้งค่าเป็น 8-64M เหมือนเดิม
# ใช้สำหรับตารางดิสก์ชั่วคราวภายใน
key_buffer_size=20M

# ขนาดของบัฟเฟอร์ที่ใช้สำหรับสแกนตาราง MyISAM แบบเต็มตาราง
# จัดสรรต่อเธรดหากจำเป็นต้องสแกนแบบเต็ม
read_buffer_size=64K

read_rnd_buffer_size=256K
tmp_table_size=64M
max_heap_table_size=64M

#*** INNODB ตัวเลือกเฉพาะ ***
# innodb_data_home_dir=

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

# หากตั้งค่าเป็น 1 InnoDB จะล้าง (fsync) บันทึกธุรกรรมไปที่
# ดิสก์ในแต่ละคอมมิชชันซึ่งมีพฤติกรรมของกรดเต็มรูปแบบ ถ้าคุณคือ
# เต็มใจที่จะประนีประนอมกับความปลอดภัยนี้ และคุณกำลังทำงานน้อย
# ธุรกรรม คุณสามารถตั้งค่านี้เป็น 0 หรือ 2 เพื่อลด I/O ของดิสก์เป็น
# บันทึก ค่า 0 หมายความว่าบันทึกถูกเขียนไปยังไฟล์บันทึกเท่านั้น และ
# ไฟล์บันทึกถูกล้างไปยังดิสก์ประมาณหนึ่งครั้งต่อวินาที ค่า 2
# หมายถึงบันทึกถูกเขียนไปยังไฟล์บันทึกในแต่ละการกระทำ แต่บันทึก
# ไฟล์จะถูกล้างลงดิสก์ประมาณหนึ่งครั้งต่อวินาทีเท่านั้น
innodb_flush_log_at_trx_commit=2

# ขนาดของบัฟเฟอร์ InnoDB ใช้สำหรับการบัฟเฟอร์ข้อมูลบันทึก เร็ว ๆ นี้
# เต็มแล้ว InnoDB จะต้องล้างข้อมูลลงดิสก์ ในขณะที่มันถูกล้างออก
# หนึ่งครั้งต่อวินาที มันไม่สมเหตุสมผลที่จะมีขนาดใหญ่มาก
# (แม้จะมีธุรกรรมที่ยาวนาน)
innodb_log_buffer_size=200M

# InnoDB ซึ่งแตกต่างจาก MyISAM ใช้พูลบัฟเฟอร์เพื่อแคชทั้งดัชนีและ
#แถวข้อมูล ยิ่งคุณตั้งค่านี้มากเท่าใด ดิสก์ I/O ก็ยิ่งจำเป็นเท่านั้น
#เข้าถึงข้อมูลในตาราง บนเซิร์ฟเวอร์ฐานข้อมูลเฉพาะ คุณสามารถตั้งค่านี้ได้
# พารามิเตอร์สูงถึง 80% ของขนาดหน่วยความจำกายภาพของเครื่อง อย่าตั้งค่า
# ใหญ่เกินไป แต่เนื่องจากการแข่งขันของหน่วยความจำกายภาพอาจ
# ทำให้เกิดการเพจในระบบปฏิบัติการ โปรดทราบว่าในระบบ 32 บิตคุณ
# อาจถูกจำกัดไว้ที่ 2-3.5G ของหน่วยความจำระดับผู้ใช้ต่อการประมวลผล ดังนั้นอย่าทำเช่นนั้น
#ตั้งสูงเกินไป
#[29062021]เปลี่ยนโดย Sridharan เพื่อเพิ่มขนาด innodb buffer pool จาก 16G เป็น 24G
#[06072021]เปลี่ยนโดย Sridharan เพื่อเพิ่มขนาด innodb buffer pool จาก 24G เป็น 48G
innodb_buffer_pool_size=185G

# ขนาดของแต่ละไฟล์บันทึกในกลุ่มบันทึก คุณควรกำหนดขนาดรวมกัน
# ของไฟล์บันทึกถึงประมาณ 25%-100% ของขนาดบัฟเฟอร์พูลของคุณเพื่อหลีกเลี่ยง
# กิจกรรมล้างบัฟเฟอร์พูลที่ไม่จำเป็นในการเขียนทับไฟล์บันทึก อย่างไรก็ตาม,
# โปรดทราบว่าขนาดไฟล์บันทึกที่ใหญ่ขึ้นจะเพิ่มเวลาที่จำเป็นสำหรับ
#ขั้นตอนการกู้คืน
innodb_log_file_size=4G

# จำนวนเธรดที่อนุญาตภายในเคอร์เนล InnoDB ค่าที่เหมาะสมที่สุด
# ขึ้นอยู่กับแอพพลิเคชั่น ฮาร์ดแวร์ และระบบปฏิบัติการเป็นอย่างสูง
#คุณสมบัติของตัวกำหนดตารางเวลา ค่าที่สูงเกินไปอาจทำให้ด้ายหลุดได้
#innodb_thread_concurrency=17
innodb_thread_concurrency=32

# ขนาดที่เพิ่มขึ้น (เป็น MB) สำหรับการขยายขนาดของไฟล์พื้นที่ตารางระบบ InnoDB ที่ขยายอัตโนมัติเมื่อเต็ม
innodb_autoextend_increment=64

# จำนวนภูมิภาคที่แบ่งกลุ่มบัฟเฟอร์ InnoDB
# สำหรับระบบที่มีบัฟเฟอร์พูลในช่วงหลายกิกะไบต์ การแบ่งบัฟเฟอร์พูลออกเป็นอินสแตนซ์แยกกันสามารถปรับปรุงการทำงานพร้อมกัน
# โดยการลดความขัดแย้งเมื่อเธรดต่างๆ อ่านและเขียนไปยังเพจที่เก็บไว้
#innodb_buffer_pool_instances=8
#[29062021 Sridharan] เพิ่มบัฟเฟอร์พูลอินสแตนซ์จาก 8 เป็น 12
innodb_buffer_pool_instances=12

#[29062021 Sridharan] เพิ่มการกำหนดค่า io_capacity, read_io_threads และ write_io_threads เพื่อเพิ่มความเร็วในการสืบค้น
innodb_read_io_threads = 32
innodb_write_io_threads = 32
innodb_io_capacity = 2,000
innodb_io_capacity_max = 4000

# กำหนดจำนวนเธรดที่สามารถป้อน InnoDB ได้พร้อมกัน
innodb_concurrency_tickets=5,000

# ระบุระยะเวลาหน่วยเป็นมิลลิวินาที (ms) บล็อกที่แทรกลงในรายการย่อยเก่าต้องอยู่ที่นั่นหลังจากเข้าถึงครั้งแรกก่อน
# สามารถย้ายไปที่รายการย่อยใหม่ได้
innodb_old_blocks_time=1,000

# ระบุจำนวนไฟล์ .ibd สูงสุดที่ MySQL สามารถเปิดได้ในครั้งเดียว ค่าต่ำสุดคือ 10
innodb_open_files=300

# เมื่อเปิดใช้งานตัวแปรนี้ InnoDB จะอัปเดตสถิติระหว่างคำสั่งข้อมูลเมตา
innodb_stats_on_metadata=0

# เมื่อเปิดใช้งาน innodb_file_per_table (ค่าเริ่มต้นใน 5.6.6 และสูงกว่า) InnoDB จะเก็บข้อมูลและดัชนีสำหรับแต่ละตารางที่สร้างขึ้นใหม่
# ในไฟล์ .ibd แยกต่างหาก แทนที่จะอยู่ในพื้นที่ตารางของระบบ
innodb_file_per_table=1

# ใช้รายการค่าต่อไปนี้: 0 สำหรับ crc32, 1 สำหรับ sql_crc32, 2 สำหรับ innodb, 3 สำหรับ strict_innodb, 4 สำหรับไม่มี, 5 สำหรับ strict_none
innodb_checksum_algorithm=0

# จำนวนคำขอการเชื่อมต่อคงค้างที่ MySQL สามารถมีได้
# ตัวเลือกนี้มีประโยชน์เมื่อเธรดหลักของ MySQL ได้รับคำขอการเชื่อมต่อจำนวนมากในเวลาอันสั้น
# จากนั้นจะใช้เวลาสักครู่ (แม้ว่าจะน้อยมาก) เพื่อให้เธรดหลักตรวจสอบการเชื่อมต่อและเริ่มเธรดใหม่
# ค่า back_log ระบุจำนวนคำขอที่สามารถซ้อนกันได้ในช่วงเวลาสั้นๆ ก่อน MySQL ชั่วขณะ
# หยุดตอบคำขอใหม่
# คุณต้องเพิ่มสิ่งนี้ก็ต่อเมื่อคุณคาดว่าจะมีการเชื่อมต่อจำนวนมากในช่วงเวลาสั้นๆ
back_log=80

# หากตั้งค่านี้เป็นค่าที่ไม่ใช่ศูนย์ ตารางทั้งหมดจะปิดทุก ๆ วินาที flush_time เพื่อเพิ่มทรัพยากรและ
# ซิงโครไนซ์ข้อมูลที่ไม่ได้ล้างออกไปยังดิสก์
# ตัวเลือกนี้ใช้ได้ดีที่สุดกับระบบที่มีทรัพยากรน้อยที่สุดเท่านั้น
flush_time=0

# ขนาดต่ำสุดของบัฟเฟอร์ที่ใช้สำหรับการสแกนดัชนีธรรมดา การสแกนดัชนีช่วง และการรวมที่ไม่ได้ใช้
# ดัชนีและทำการสแกนตารางทั้งหมด
join_buffer_size=256K

# ขนาดสูงสุดของหนึ่งแพ็กเก็ตหรือสตริงใดๆ ที่สร้างขึ้นหรือระดับกลาง หรือพารามิเตอร์ใดๆ ที่ส่งโดย
# mysql_stmt_send_long_data() ฟังก์ชัน C API
max_allowed_packet=1024M

# หากคำขอเชื่อมต่อต่อเนื่องจากโฮสต์มากกว่านี้หลายรายการถูกขัดจังหวะโดยที่การเชื่อมต่อไม่สำเร็จ
# เซิร์ฟเวอร์บล็อกโฮสต์ไม่ให้ทำการเชื่อมต่อเพิ่มเติม
max_connect_errors=100

# เปลี่ยนจำนวนตัวอธิบายไฟล์ที่มีให้สำหรับ mysqld
# คุณควรลองเพิ่มค่าของตัวเลือกนี้หาก mysqld แสดงข้อผิดพลาด "Too many open files"
open_files_limit=4161

# หากคุณเห็น sort_merge_passes จำนวนมากต่อวินาทีในเอาต์พุต SHOW GLOBAL STATUS คุณสามารถลองเพิ่ม
# ค่า sort_buffer_size เพื่อเพิ่มความเร็วในการดำเนินการ ORDER BY หรือ GROUP BY ที่ไม่สามารถปรับปรุงได้ด้วยการเพิ่มประสิทธิภาพแบบสอบถาม
# หรือการจัดทำดัชนีที่ดีขึ้น
sort_buffer_size=256K

# จำนวนคำจำกัดความของตาราง (จากไฟล์ .frm) ที่สามารถเก็บไว้ในแคชคำจำกัดความ
# หากคุณใช้ตารางจำนวนมาก คุณสามารถสร้างแคชข้อกำหนดตารางขนาดใหญ่เพื่อเพิ่มความเร็วในการเปิดตาราง
# แคชข้อกำหนดตารางใช้พื้นที่น้อยและไม่ใช้ตัวอธิบายไฟล์ซึ่งแตกต่างจากแคชตารางปกติ
# ค่าต่ำสุดและค่าเริ่มต้นคือ 400
table_definition_cache=1400

# ระบุขนาดสูงสุดของเหตุการณ์บันทึกไบนารีตามแถวเป็นไบต์
# แถวจะถูกจัดกลุ่มเป็นเหตุการณ์ที่เล็กกว่าขนาดนี้หากเป็นไปได้ ค่าควรเป็นผลคูณของ 256
binlog_row_event_max_size=8K

# หากค่าของตัวแปรนี้มากกว่า 0 แบบจำลองจะซิงโครไนซ์ไฟล์ master.info กับดิสก์
# (ใช้ fdatasync()) หลังทุกเหตุการณ์ sync_master_info
sync_master_info=10,000

# หากค่าของตัวแปรนี้มากกว่า 0 เซิร์ฟเวอร์ MySQL จะซิงโครไนซ์บันทึกการถ่ายทอดไปยังดิสก์
# (ใช้ fdatasync()) หลังจากทุก sync_relay_log เขียนไปยังบันทึกการถ่ายทอด
sync_relay_log=10,000

# หากค่าของตัวแปรนี้มากกว่า 0 แบบจำลองจะซิงโครไนซ์ไฟล์ relay-log.info กับดิสก์
# (ใช้ fdatasync()) หลังจากทุกธุรกรรม sync_relay_log_info
sync_relay_log_info=10000

# โหลดปลั๊กอิน mysql เมื่อเริ่มต้น "plugin_x ; plugin_y"
#plugin_load

# พอร์ต TCP/IP ที่ MySQL Server X Protocol จะรับฟัง
# Loose_mysqlx_port=33060
# relay-log = C:/ProgramData/MySQL/MySQL Server 5.7/Data/mysql-relay-bin.log
relay-log=F:\MySQL\Data\mysql-relay-bin.log

# log_bin=C:/ProgramData/MySQL/MySQL Server 5.7/Data/mysql-bin.log
log_bin=F:\MySQL\Data\mysql-bin.log

binlog_do_db=jira_datacenter
binlog_format=ผสม
ua flag
แสดงข้อความค้นหา 30 นาทีนั้น และ `SHOW CREATE TABLE` ที่เกี่ยวข้อง นอกจากนี้โต๊ะใหญ่แค่ไหนและชุดผลลัพธ์ใหญ่แค่ไหน?
Sridharan Srinivasan avatar
cn flag
ขอบคุณสำหรับการตอบสนองริค ข้อความค้นหา 30 นาทีเป็นเพียงตัวอย่างเท่านั้น แม้แต่บันทึก 6K ก็ใช้เวลาประมาณ 2 นาทีในการรันบนเซิร์ฟเวอร์ใหม่ การสืบค้น 6K ทำงานในเซิร์ฟเวอร์ภายในองค์กรน้อยกว่า 10 วินาที นั่นคือเหตุผลที่ฉันไม่ลงลึกถึงการสืบค้น/ตาราง/ดัชนี เนื่องจากดูเหมือนว่าปัญหาจะอยู่ที่ระดับเซิร์ฟเวอร์
ua flag
จากประสบการณ์ของฉัน คุณไม่สามารถ "แก้ปัญหาประสิทธิภาพ" ได้ ในขณะเดียวกัน มีหลายวิธีในการเขียนข้อความค้นหาที่ไม่มีประสิทธิภาพและ/หรือไม่มีดัชนีเพียงพอ ฉันรู้ว่าเครื่องจักรกำลังแสดงประสิทธิภาพที่แตกต่างกันอย่างสิ้นเชิง แต่จะช่วยให้เห็นว่าข้อความค้นหากำลังทำอะไรเพื่อดูว่าควรดูที่ใด
Score:0
ธง cn

ฉันขอแนะนำให้คุณในเบื้องต้น ทำซ้ำ การกำหนดค่า MySql ภายในองค์กรที่มีอยู่ของคุณไปยัง Azure VM ของคุณ การตั้งค่าเดียวกันทั้งหมด ด้วยวิธีนี้ คุณกำลังเปรียบเทียบสิ่งที่ชอบกับสิ่งที่ชอบ
ตอนนี้คุณมี มากเกินไป การเปลี่ยนแปลงที่เกิดขึ้นพร้อมๆ กัน และคุณไม่สามารถมองเห็นได้ว่าสิ่งใดเป็นสาเหตุของปัญหา

... เราสังเกตเห็นว่าแม้ว่าข้อความค้นหาบางส่วนจะใช้เวลา 30+ นาทีในการรัน (ดูเหมือนว่าจะทำงานในเซิร์ฟเวอร์ภายในองค์กรในเวลาเพียง 5 นาที) ...

แม้แต่ 5 นาทีก็เป็น เวลานาน สำหรับการเรียกใช้แบบสอบถาม
สามารถสอบถามเหล่านี้ ปรับแม้แต่ในอินสแตนซ์แบบ on-prem?
พวกเขากำลังดึงข้อมูลจำนวนมากผ่านเครือข่ายหรือไม่? พูดง่ายๆ ก็คือ Azure VM ของคุณอยู่ในส่วนท้ายของสตริงอิเล็กทรอนิกส์ที่ยาวกว่าอินสแตนซ์ภายในองค์กรของคุณ (และอาจอยู่ภายใต้การกำหนดเส้นทางเครือข่าย การจัดการทราฟฟิก ฯลฯ ทุกประเภท)

... การใช้งาน CPU บน VM ยังคงต่ำมาก ...

อีกครั้ง ดูเหมือนว่าข้อมูลจำนวนมากถูกเคลื่อนย้ายไปรอบๆ โดยมีการประมวลผลฝั่งเซิร์ฟเวอร์น้อยมาก
เป็น ดิสก์ ไม่ว่าง? ข้อความค้นหาที่มีการอัปเดตจำนวนมากหรือใช้ชุดผลลัพธ์ชั่วคราวจำนวนมากจะ ฟาด ดิสก์โดยไม่ต้องใช้ CPU มากนัก (ในทางกลับกัน [ในหน่วยความจำ] จำนวนมาก การสแกนตาราง มักจะพิสูจน์ตัวเองจากการโหลด CPU สูงและกิจกรรมดิสก์ต่ำ)

Sridharan Srinivasan avatar
cn flag
ขอบคุณมากสำหรับการตอบสนอง เราได้เปรียบเทียบการกำหนดค่าระหว่าง my.ini บนเซิร์ฟเวอร์ทั้งสอง และตรวจสอบให้แน่ใจว่าเราได้ตั้งค่าให้ใกล้เคียงกับเซิร์ฟเวอร์ภายในองค์กรมากที่สุด
Sridharan Srinivasan avatar
cn flag
ขอบคุณมากสำหรับการตอบสนอง เราได้เปรียบเทียบการกำหนดค่าระหว่าง my.ini บนเซิร์ฟเวอร์ทั้งสอง และตรวจสอบให้แน่ใจว่าเราได้ตั้งค่าให้ใกล้เคียงกับเซิร์ฟเวอร์ภายในองค์กรมากที่สุด และแบบสอบถามใช้เวลา 5 นาทีภายในองค์กร เนื่องจากสามารถดึงข้อมูลได้เกือบ 4 ล้านรายการ และนี่เป็นเพียงตัวอย่างเท่านั้น แม้แต่บันทึก 6K ก็ใช้เวลาประมาณ 2 นาทีในการรันบนเซิร์ฟเวอร์ใหม่ และฉันกำลังพูดถึงรันไทม์โดยตรงบน Azure VM (ฉันหมายถึงการเข้าสู่ระบบ Azure VM ดังนั้นแบนด์วิธของเครือข่ายจึงไม่ปรากฏในภาพ) ดิสก์ - IOPS ที่อ่านบนดิสก์สูงถึงประมาณ 2K แต่ดิสก์สามารถรองรับได้สูงสุด 7K

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา