วันนี้มีปัญหาขึ้นมาครับ เนื่องจาก MySQL Cluster ที่ใช้งบานนั้นลองทดสอบความเร็วแล้วสู้ MySQL แล้วใช้ Local Engine ไม่ได้เลย งานนี้เลยต้องหาทางออกครับ ผมเลยไปมอง เรื่อง MySQL Replication หลังจาก Setup และ Tuning เสร็จ ก็มาลองทดสอบความเร็ว มัน Query เร็วกว่า MySQL Cluster หลายเท่าเลยครับ
ทีนี้ก็มาดูเรื่อง Codeing ปัญหาคือมันเป็นโปรแกรมที่เค้าเขียนมานานละ ผมเข้าไปแก้อะไรไม่ค่อยได้ หรือถ้าแก้จริงๆ อยาจจะเป็น Bug อีกก็ได้ คิดไปๆมาๆ อ่าเจอทางออกแล้ว
ปัญหา
– MySQL Cluster ช้า ต้องไปใช้ MySQL Replication แทน
– ไล่แก้ Code ลำบาก เพระา code ค่อนข้างมาก
– Query ต้องเร็วและเพิ่ม MySQL Server ได้ในอนาคต
ทางแก้
– MyQL-Proxy ส่วนนี้ผมลองเอามาใช้แล้วครับ ลอง Query ดูมันก็ยังช้ากว่า Connect เข้า DB ตรงๆถึง 5 – 10 เท่า
– Edit Query ผมเลือกทางนี้ครับ แต่มันมีวิธีลักไก่หน่อย แนวคิดคือต้องไม่ไปยุ่งกะ Code มาก ผมเลยทำการสร้าง php function ใหม่ขึ้นมาครับ โดยทำหน้าที่ check sql ก่อนที่จะ Query ว่าเป็น SELECT, UPDATE, INSERT, DELETE แล้วให้ function ที่สร้างขึ้นมา เลือกที่จะไป query กะ mysql เครื่องไหน
1. สร้าง function mysql_do_query
function mysql_do_query( $sql, $count_rw=null)
{
global $conn_ro, $count_rw, $count_ro;
if ( ! empty( $sql))
{
if ( ereg("^SELECT(.*)", strtoupper( $sql)))
{
$count_ro++;
return mysql_query( $sql, $conn_ro);
} else {
$count_rw++;
return mysql_query( $sql);
}
}
}
2. ทำการ edit *.php แล้วทำการ replace mysql_query -> mysql_do_query โดยผมใช้ คำสั่ง sed ใน shell script เพื่อแก้ไขไฟล์
#!/bin/bash
for fl in *.php; do
mv $fl $fl.old
sed 's/mysql_query/mysql_query/g' $fl.old > $fl
rm -f $fl.old
done
เสร็จแล้วก็รันครับ shell script จะทำการ find หา *.php แล้วทำการเปลี่ยน function ให้ ต่อไปเวลา ให้ programmer เขียน codeing ก็ให้ทำการ ใช้ function mysql_do_query() แทนครับ