Displaying articles with tag mysql

Persistent connection in MySql

Posted by PunNeng, Tue Feb 27 17:38:00 UTC 2007

...บ่นไปที่โพสอันก่อนอยู่แหม็บๆ วันนี้มาพูดถึงเรื่อง persistent connection ใน mysql ละ

ปกติที่เราเขียนติดต่อ mysql กัน เชื่อเหอะ ส่วนใหญ่จะใช้ mysql_connect กันทั้งนั้นแหละ ซึ่งการใช้ฟังก์ชั่นนี้ มันจะ connect เข้า mysql ทุกครั้งที่มีการรันไฟล์ php นั้น ก็คิดดูเอาว่าถ้ามี pageviews ประมาณ 5 พันต่อวัน ก็ต้องมีการ connect เกิดขึ้น 5 พันครั้งต่อวัน เลยทีเดียว

mysql_pconnect() เป็นการสั่งให้ใช้ persistent connection ซึ่งเป็น connection ที่เปิดตลอดเวลา (connect ทีเดียว แล้ว connection นั้นจะค้างไปตลอด) ถ้าเว็บของเรามีคนเข้าตลอดทั้งวันทั้งคืน การใช้ pconnect จะช่วยให้ลดการ connect เข้า mysql ได้โขเลยทีเดียว ซึ่งทำใหเว็บของเราเร็วขึ้นอีก

connection ของ pconnect จะค้างไว้นานเท่าไหร่ ขึ้นอยู่กับการกำหนดค่า wait_timeout ใน mysql ซึ่งปกติจะอยู่ที่ 8 ชั่วโมง (ใครเปิดด้วย connect() แล้วไม่ปิด ระวัง เหอๆ) ถ้าภายใน 8 ชั่วโมง ไม่มีการเรียก pconnect() อีก connection นั้นก็จะถูกปิดไป แต่ถ้าก่อนหน้านั้นมีการเรียก pconnect ก็จะใช้ connection เดิมนั่นแหละ เร็วดี

ของดีแบบนี้ ไม่ใช้ ก็กระไรอยู่ใช่มั้ยครับ

... ฮ่าๆ คิดผิดถนัด อย่าลืมว่า process การ request ของ client เนี่ย จะ handle จาก apache process ซึ่ง apache process จะอยู่นานเท่าไหร่ ขึ้นอยู่กับ timeout ของ apache ด้วย ซึ่งปกติจะอยู่ที่ 300 วินาที พอ apache process มัน timeout ไปแล้ว persistent connection ที่ apache process นั้น handle อยู่ ก็จะเคว้งคว้าง กลายเป็นผีไร้ศาล (ถ้าค้างมากๆ ก็จะเกิน max_connections ซะอีก) แล้ว persistent connection นั้นก็จะค้างเติ่งอยู่จนกว่าจะถึง timeout ของ mysql

ฉะนั้น ทางแก้ก็คือ แก้ wait_timeout ของ mysql ให้ใกล้เคียงกับ apache timeout ด้วย จะได้ไม่มีผีจนล้น server

คำเตือน : shared host ควรดู wait_timeout ของ mysql ก่อนตัดสินใจใช้ pconnect ทุกครั้ง เดี๋ยวจะกลายเป็นว่า pconnect สร้างปัญหามากกว่าเดิม

0 comments | Filed Under: General | Tags: mysql

เล่นไป บ่นไป : MySql

Posted by PunNeng, Sun Feb 25 00:06:00 UTC 2007

AMp เขียนครับ

...อุตส่าห์หลงปลื้ม mysql ตั้งนานว่าทั้งฟรีทั้งดี แถมยังเป็นรองแค่ oracle อีกต่างหาก (ใน whitepaper ที่ mysql อวดไว้) สงสัยผมคงต้องคิดใหม่ละ เพราะยิ่งเล่น ก็ยิ่งรู้สึกว่ามันตันๆ ในหลายๆ อย่าง ทั้งในเรื่องการใช้งานและประสิทธิภาพ (หรือผมใช้งานมันผิดประเภทหว่า?)

- mysql ไม่มี session temporary table ใครที่เคยเล่น mssql จะรู้ว่ามันสามารถทำ #table ที่เป็น session temporary table ได้ ทำให้การ process งานใน store ทำได้คล่องตัวมาก เพราะ session temporary table นี้มันจะเห็นและใช้งานได้เฉพาะ connection นั้นๆ ไม่เกี่ยวกับ connection อื่นๆ ต่างกับ mysql ที่ถึงแม้จะมี memory engine แต่ก็ต้องสร้างรอไว้ ไม่สามารถสร้างแยกตาม connection ได้ ถ้า mysql มี #table ล่ะก็ น่าจะมันส์ขึ้นอีกเยอะ

- mysql เปราะจริงๆ เนื่องจากผมเห็นมันโฆษณาว่าเป็นรองแค่ oracle ก็เลยลองซะหน่อย ทำ select แบบ cross join กับข้อมูล 5 ล้านเรคอร์ด ... ผลน่ะหรอ .... เครื่องแทบค้าง อันนี้เป็นเพราะว่าเครื่องผมไม่แรงพอ แต่พอผมปิด process ของ mysql แล้วเปิดใหม่อีกรอบเท่านั้นแหละ ... แม่เจ้าาา ... DB ที่ใช้ทดสอบพังไปเลย เข้าใช้งานไม่ได้อีกเลยครับ แล้วแบบนี้ ถ้าใช้ๆ งานอยู่ แล้วเครื่องค้างขึ้นมา มิซวยแย่หรอเนี่ย - -'

- stored procedure ยังพัฒนาไม่เต็มที่? ปกติถ้าเขียน sp (ย่อจาก stored procedure) มันจะช่วยให้ query ได้เร็วขึ้น เพราะมีการทำ execution plan ไว้ตั้งแต่ตอน compile sp แล้ว แถมไม่ต้องเสียเวลาขนข้อมูลไปๆ มาๆ ระหว่าง client ด้วย แต่ที่ผมลองกับ process การคำนวนเรื่องความใกล้เคียงของกล้องดิจิตอลที่ใช้งานจริงใน focusshot.com มันกลับอืดยิ่งกว่าเดิมซะอีก แถมเล่นซะเครื่องแทบค้าง ทั้งๆ ที่ก่อนหน้านี้ process นี้เขียนด้วย php ก็รันได้ปกติ ไม่ถึงกับทำให้เครื่องค้างแต่อย่างใด (แค่อืดเล็กน้อย) ตอนนี้ชักเริ่มสงสัยละว่าเป็นที่ผมเขียนไม่ดี หรือว่า sp ใน mysql ยังพัฒนาไม่เต็มที่กันแน่ (ตอนเครื่องค้างขณะรัน sp ที่ว่านี้ ผมก็ปิด process ด้วยการเรียก stop service ตามที่มันควรจะเป็น (คราวที่แล้วปิดถึกๆ ด้วย task manager) ปรากฏว่า DB ก็พังเหมือนเดิม เวรจริงๆ - แต่บางทีก็ไม่พัง เสี่ยงดวงเอา)

- อยากได้ tool ของ mysql อย่าง ms query analyzer จัง ทีแรกก็ไม่ได้คิดอะไรหรอกครับ เรื่อง tool ของ mysql เนี่ย มีให้ใช้ฟรีๆ ก็ใช้ไปเหอะ แต่พอได้เล่น query analyzer ของ mssql แล้ว ก็รู้สึกว่า มันใช้งานได้คล่องดี คีย์ลัดก็ไม่ต้องกดมาก ในขณะที่ tool ทางฝั่ง mysql กว่าจะเขียนโค้ด กว่าจะรัน ไม่ทันกินจริงๆ (navicat ถ้าจะรัน selected command ต้องกด ctrl+shift+r ... ทำไมมันไม่ทำให้กด F5 เหมือน query analyzer ฟะ กดบ่อยๆ เมื่อยมือนะเนี่ย - -*)

...ก็นะ ถึงจะบ่นๆ แต่ก็ใช้ mysql ต่อปายยย เหอๆ

ป.ล. หลังจากที่บ่นไปข้างบนแล้ว ก็ลองไปเขียน process คำนวณความใกล้เคียงใหม่อีกรอบ คราวนี้ใช้ TActiveRecord ของ Prado ปรากฏว่า ทำงานได้ช้ามากๆ (แต่เครื่องไม่ค้าง) ข้อมูล 1.2 ล้านเรคอร์ด คาดว่าน่าจะใช้เวลาเกิน 1 ชั่วโมง ก็เลยจำใจ ต้องเล่นบทไถนา เขียนด้วย native php เหมือนเดิม ปรากฏว่าใช้เวลาไม่ถึง 10 นาที (ไม่กล้าเอาไปรันที่โฮสจริงเลย ให้ตายดิ - -')

ป.ล.2 กลับมาคิดๆ เรื่อง sp ใน mysql ที่เล่นซะเครื่องค้าง อาจจะเป็นไปได้ว่า sp เร็วจริง ไม่มี bottle neck เรื่อง network เข้ามาเกี่ยว ก็เลยสูบ cpu ได้เต็มที่ แต่ cpu รับไม่ไหว เลยกลายเป็นว่า เครื่องค้าง และทำงานช้ากว่าเดิม

ป.ล.3 ตอนนี้ focusshot.com เป็นผีไร้ศาลอยู่ครับ ไหนๆ ก็ไม่มีศาลละ เลยนั่งทำใหม่ด้วย prado ซะเลย

0 comments | Filed Under: General | Tags: mysql

codegent: we're hiring