Archive for the ‘mysql’ Category
ซ่อม database mysql
เมื่อวานถึงกับมึน ว่าอยู่ๆ มันก็พังไปซะงั้น ทั้งๆ ทั้ก็ไม่ได้ทำอะไรนี่นา T_T
เริ่งเกิดที่ http://www.thaihosttalk.com/index.php?topic=20692.0 นี่ครับ
นั่งทำนานแสนนานกับ mysql ตกลงแล้ว database พัง แล้วไปพังที่ใหนรู้ใหมครับ mysql.user ให้ตายซิ run mysql ก็ไ่ม่ได้
พี่ไก่ thaitumweb เลยให้ซ่อมซะคือ
myisamchk -r user.MYI
ได้ครับ โหคราวนี้ ซ่อมหมดเลยดังนี้
myisamchk -r /var/lib/mysql/*/*.MYI
ไปหลาย database เลย อะไรมันจะซวยปานนี้ ใครที่ทำกันกันตรวจกันบ่อยๆนะ
เข้าใจ sphinx full text search engine
จากที่เคยเกริ่นเรื่องเกี่ยวกับ sphinx full text search ไปแล้วทีนึง คราวนี้เรามาดูวิธีและหลักการทำงานของ full text search กัน
full text search engine นั้นจะทำงานในลักษณะของการทำ data ที่มาจากที่เรา config ไว้ มาทำเป็น index เฉพาะแบบของ fulltext search นั้นๆ ซึ่งแต่ละตัวก็จะไม่เหมือนกัน บางที่อาจจะไม่ได้ใช้แนวคิดนี้ แต่เห็นหลายๆ ที่จะเป็นแบบนี้ เพื่อให้สามารถ ค้นหาข้อมูลในรูปแบบของตัวเองได้
sphinx ก็เช่นเดียวกัน เราจะต้อง config ว่าให้ seletct ส่วนใด มาทำเป็น เนื้อความสำหรับ search ได้บ้าง หลังจากนั้นเราก็ตั้งใช้คำสั่งสร้าง index ขึ้นมา sphinx ก็จะสร้าง index ของตนเองขึ้นมา ให้สามารถทำการ search ได้ง่ายตามรูปแบบที่ตั่งไว้
การใช้งาน search นั่นเวลาจะใช้งานจึงต้องเขียนออกมาเป็นอีกส่วน ในส่วนใหญ่แล้วโปรแกรมพวกนี้ก็จะเปิด port อีก port ไว้เลยเป็นของตนเองอย่าง sphinx เองก็เปิด port ไว้เหมือนกัน ซึ่งตอนที่รัน เราก็สามารถ config ลงไปได้ด้วยว่าอยากจะเปิด port อะไีร เวลาสร้าง connection ก็ต่อมาที่ port นั้นๆที่ตั้งไว้
Sphinx เองเปิด port 3312 เป็น default ดูได้จาก sphinx.conf
# IP address to bind on
# optional, default is 0.0.0.0 (ie. listen on all interfaces)
#
# address = 127.0.0.1
# address = 192.168.0.1# searchd TCP port number
# mandatory, default is 3312
port = 3312
full text search engine ส่วนใหญ่จะมี library สำหรับติดต่อกับตัวเองพร้อมทั้ง reference มาให้อยู่แล้วเพื่อความสะดวกในการใช้งาน sphix ก็มีเช่นกัน คือ folder api ที่มาพร้อมๆ กับตัวที่ download มาติดตั้งแหละ มีทั้ง ภาษา PHP, ptyhon, ruby และ java เลยทีเดียว
รวมทั้งยังมี reference การใช้งานอีกด้วยที่ http://www.sphinxsearch.com/docs/current.html#api-reference
จากการที่เราทำ index ครั้งนึงเราก็จะ search ได้เพียงสิ่งที่เรานั่นสร้าง index ไป ดังนั้นเราก็ต้องทำ index เรื่อยๆ เช่นการทำ cronjob ของ indexer เป็นต้น
แต่การทำ cron ก็จะได้ ข้อมูลในการ search ไม่เป็นปัจจุบันเสมอ แต่จะ search ไปตามช่วงเวลาแทน sphinx เองก็มี mode ในการทำทั้ง merge index หรือการสร้าง index เสมอทุกๆ การใช้งาน ก็เอาไว้ต่อกันทีหลังแล้วกันนะ
sphinx full text search engine
วันนี้ทำงานสบายๆ ก็เลยมาเขียนซะหน่อย ห่างหายไปจาก blog นานๆ แล้ว ที่จะพูดถึงวันนี้ก็คือ fulltext search
ช่างเป็นอะไรที่ กิน performance เครื่องสุดๆ ลองคิดถึง algorithm ง่ายของ LIKE ใน SQL นะ
1 record ก็จะมีั text เช่น ‘some text’
แล้วเราก็หาคำว่า ‘me’ ใน text นี้ มันก็ต้องหา so, om, me แล้วก็เจอ ลองคิดดูว่ามันจะหาไปกี่ที
แน่นอนว่า วิธีนี้มันโง่และทึ่มมาก เพราะทำงานธรรมดาสุดๆ คือ เทียบกันไปเรื่อยๆ การทำงานจึงเป็น loop ไป เรื่อยๆ แต่ปัจจุบันนั้นก็มีคนศึกษาเรื่องนี้และได้คิด algorithm ออกมาเพื่อที่จะจัดการกับ full text search อีกมาก บาง algorithm ก็ได้รับความนิยม จนไปสู่การนำมาใช้งานจริง
.
sphinx ก็เป็นอีก 1 ตัวที่ได้รับความนิยมอยู่ในขณะนี้ เพราะด้วย performance และการใช้งานนั้นง่าย รวมทั้งยังเป็น Open Source อีกด้วย ทำให้เปิดโลกกว้างการการเพิ่มเติมและการนำไปใช้ด้วย
sphinx search นั้นมี feature หลักคือ
- high indexing speed (upto 10 MB/sec on modern CPUs)
- high search speed (avg query is under 0.1 sec on 2-4 GB text collections)
- high scalability (upto 100 GB of text, upto 100 M documents on a single CPU)
- supports distributed searching (since v.0.9.6)
- supports MySQL natively (MyISAM and InnoDB tables are both supported)
- supports phrase searching
- supports phrase proximity ranking, providing good relevance
- supports English and Russian stemming
- supports any number of document fields (weights can be changed on the fly)
- supports document groups
- supports stopwords
- supports different search modes (“match all”, “match phrase” and “match any” as of v.0.9.5)
- generic XML interface which greatly simplifies custom integration
- pure-PHP (ie. NO module compiling etc) search client API
ซึ่งถ้าอ่านดีๆ แล้วก็จะเห็น performance นั้นสูงทีเดียวและสามารถใช้งานได้ง่ายด้วย API และยัง support กับ Mysql และ postgresql ซึ่งเป็นฐานข้อมูล แบบ open source ที่ได้รับความนิยมทั่วโลก
จากที่ได้ลองติดตั้งดู ไม่มีอะไรยากเกินไปกว่า แตก tarball -> ./configure -> make -> make install แล้วก็ config อีกนิดหน่อย แค่ ใส่ user pass และ db name ของ database server ลงไปก็เสร็จแล้ว
ข้างใน config ก็มีให้เลือก database server อยู่แล้ว สามารถเลือกรูปแบบให้เหมาะสมได้เลย
ใน tutorial นั้นก็ได้มีการเขียนติดต่อกับ PHP ได้เลย เพียงนำ lib include ไปเท่านั้น
สามารถ compile ร่วมไปกับ mysql ให้เป็น engine ของ mysql ได้
วันนี้มาเกริ่นๆ เท่านั้น เกี่ยวกับ sphinx search ต่อไปก็จะมาพูดถึงการเขียนกัน แล้วก็รายละเอียด ลึกๆ แล้วกัน
Green SQL Firewall
วันนี้ได้อ่าน THT เล่นไปเรื่อยๆ แล้วก็มีคนมาเสนอหัสข้อนึงให้ลองดูก็คือ greenSQL อิอิ เหมือน Green Wifi กทม ของเราหรือเปล่า
โดย Greebn SQL นี้มีหน้าที่หลักคือ
GreenSQL is an Open Source database firewall used to protect databases from SQL injection attacks. GreenSQL works as a proxy and has built in support for MySQL. The logic is based on evaluation of SQL commands using a risk scoring matrix as well as blocking known db administrative commands (DROP, CREATE, etc)
เป็น open source database firewall ที่ช่วยป้องกันจาก sql injection attacks โดยจะทำงานคล้ายๆกับ proxy และ support MySql ใสตัวเสร็จรสรรพ
ความหมายก็ตรงตัวตามที่ได้กล่าวไว้ วิธีการทำงานก็คล้ายเๆเป็น proxy หรือ firewall ขั้นไว้นั่นเอง
ขอยืมรูปมาจากเว็บของ greensql เลย เป็นรูปแบบการติดต่อ 
แล้วก็มี blog ที่เขียนเรื่องเกี่ยวกับ green sql ไว้ด้วยแล้ว ลองอ่านได้ ที่นี่ มีทั้งการติดตั้งและแนวการใช้งานได้ด้วย
การที่มีโปรแกรมต้องรันเพิ่มขึ้นมาก็ต้องให้เครื่องทำงานเพิ่มด้วย ยิ่งเป็น database ด้วยแล้ว resource ก็ต้องใช้งานไปเยอะ แล้วถ้าติดตั้ง greensql เข้าไปจะเหมือนทำงาน database 2 ครั้งหรือเปล่า
greenSQL เองก็ได้ทำการวัดประสิทธิภาพการทำงานไว้แล้วเพราะรู้ว่าเรื่องนี้เป็นสิ่งที่จะตามมา ก็ลองไปดูกันแล้วกันนะครับที่นี่

จากกราฟสีเข้มคือ ใช้งานผ่าน mysql อย่างเดียว และ สีอ่อน จะใช้งานโดยผ่าน greenSQL แกน x เป็น Request/Sec หรือการเรียกใช้งานต่อวินาที แกน y เป็น concurrent request หรือปริมาณการเรียกใช้งานพร้อมๆกันนั่นเอง จะเห็นว่า เมื่อใช้งาน greenSQL แล้ว ตกลงมานิดๆ
การทดสอบครั้งนี้ ถูกทดสอบด้วย ab or Apache Bench แถมยังได้บอกวิธีการ Test ไว้ด้วย อ่านลงมาล่างหน่อยจะเจอ
ab -n 400 -c 10 hxxp://test-website.com/โดย
- -c หมายถึง จำนวน concurrent ที่ต้องการ
- -n หมายถึงจำนวนที่ request
Link เพิ่มเติม
Blog ที่เขียนเกี่ยวกับ Green SQL ไว้
mysql สูงสุดของ field type text
พอดีวันนี้เจอปัญหาของลูกค้าบ่อยๆ คือ การทำ description ที่ใหญ่ๆ แบบ ทำหน้าทั้งหน้าไว้ใน description หรือไป copy มานั่นเอง แล้วเราก็กำหนด description เป็น type text แล้ว แต่ดันเก็บไม่พอ 555 ใหญ่เกินนั้นเอง เวลาแสดงหน้าเว็บเลย เรียกว่าผิดรูปกันไปเลยทีเดียวเลยไปหาว่า type text เก็บได้เท่าใหร่ไปเจอที่ หนึ่งคือ http://simonwillison.net/2002/Aug/1/mysqlTextLimits/
เค้าได้บอกไว้ว่า
Today’s scary discovery: MySQL TEXT fields have a limit of 65,000 bytes. If you insert anything larger than that in to a normal TEXT field mySQL will silently truncate your data without telling you (meaning software checks are probably a good idea). MEDIUMTEXT will store 16 million characters and LONGTEXT can handle over 4 trillion, but this information does not appear to be readily available in the online mySQL manual (although it is hinted at in this table). Something to bare in mind when designing database applications.
ตรงส่วนที่เขียวก็คือปริมาณในการเก็บของแต่ละ type นั้นเอง
text จะเก็บได้ 65,000 byte นั้นเอง ถ้าคิดเป็น utf แล้วเก็บภาษาไทยก็ยิ่งน้อยไปใหญ่
mediumtext เก็บได้ 16 million byte หรือ 16 ล้าน หรือ 16 MB เพิ่มมา 240 กว่าเท่าก็ใหญ่พอควร ในการเก็บข้อมูลที่ใหญ่ แค่นี้ก้พอแล้วนะสำหรับ description ที่ copy html มาของลูกค้า แต่ก็มีอีกอันที่ใหญ่กว่าคือ
longtext นี่เก็ยได้เิบิ้มเลย 4 trillion หรือ 4 แสนล้าน นั้นเอง
database แค่ record เดียวโตมากๆไม่ดีนะ ดูที่ความจำกัดเวลาใช้ด้วย
