ไม่สนใจใช้ enum เหรอ ประหยัดกว่ากันเยอะนะ

ไม่สนใจใช้ enum เหรอ ประหยัดกว่ากันเยอะนะ

เป็น data field ที่มีมาให้ใน MySQL (และอีกหลายค่าย) แต่ว่าหลายคนแทบไม่ได้ใช้ หรือไม่เคยใช้เลย มาทำความรู้จักก่อนดีมั้ย แล้วคุณจะหลงรัก

เท่าที่ผมจำได้ ผมทำงาน web programmer จุดนี้มาหลายปี ในส่วนของงาน database นั้น ผมจะใช้ field type อยู่ไม่กี่ประเภทดังนี้ tinyint, smallint , mediumint, int, bigint, float, char, varchar, text, date, time, datetime (ถ้าใครรู้จักน้อยกว่านี้ แนะนำให้อ่าน datatype mysql นะครับ) โดยแต่ละ type จะเอามาเก็บข้อมูลที่แตกต่างกันไป แต่ผมเชื่อว่า varchar ต้องเป็นที่คุ้นเคยกับใครหลายคนอย่างแน่นอน เพราะว่าเป็นที่เก็บข้อมูลที่ได้จาก user เป็นอย่างดีเลย รวมทั้งเป็นที่เก็บข้อมูลสารพัดรูปแบบ และข้อความที่มีความยาวไม่เท่ากันอีกด้วย

แต่ว่าหากได้อ่าน datatype mysql ดีๆแล้ว ท่านจะพบว่ายังมีอีกหลายอย่างที่ไม่ได้สนใจเท่าไร ซึ่ง 1 ในนั้นก็คือ enum เพราะว่ามีความน่าสนใจมากเนื่องจากสามารถเก็บรูปแบบของตัวหนังสือได้ โดยใช้พื้นที่ น้อยมาก

ยกตัวอย่างเช่น ปกติที่เก็บชื่อจังหวัด ปกติผมจะใช้ varchar(25) เพราะว่าเราไม่ทราบได้ว่า  user จะ input จังหวัดอะไรเข้ามาแน่ เพราะว่าบางจังหวัดก็สั้นยาวไม่เท่ากันอีก ก็เลยสร้างเผื่อๆไว้เลย การทำแบบนี้ หาก user ใส่ข้อมูลจังหวัด "สุพรรณบุรี" ก็เท่ากับว่า เราจะใช้พื้นที่เก็บข้อมูล 10+1 = 11 bytes และจะใช้ (10*3)+1 = 31 bytes หากเป็นอักขระแบบ UTF-8 

การเก็บข้อมูลในลักษณะตัวอย่างนี้ เราสามารถเปลี่ยนมาใช้ enum ได้ เป็นเพราะว่า ประเทศไทยมี 76 จังหวัด ซึ่งไม่มีการเปลี่ยนแปลงง่ายๆอยูู่แล้ว และไม่มีทางเกินกว่านี้ได้ด้วย ไม่ว่า user เลือกจังหวัดอย่างไรก็ต้องเป็น 1 ใน 76 จังหวัดนี้อย่างแน่นอน

โดยถ้าเป็นกรณีจังหวัดนี้ enum จะใช้เพียง 1 byte ต่อ record  ในการเก็บเท่านั้น!! หรือถ้า ประเทศไทยมี 256 จังหวัด หรือมากกว่านั้น (แต่จะต้องไม่เกิน 65,535 จังหวัดนะ) enum ก็จะใช้พื้นที่จัดเก็บเพียงแค่ 2 bytes ต่อ record เท่านั้น เชื่อหรือไม่ครับ ผมก็ไม่ได้บอกให้เชื่อ แต่ถ้าขยัน แนะนำให้ลองเองครับ 555 เพราะผมลองเช็คคร่าวๆมาแล้ว ว่าประหยัดกว่า varchar ในข้อมูลรูปแบบ และจำนวนที่เท่ากัน จริงๆ ดังนั้นไม่ว่า จังหวัดเลย หรือเชียงใหม่ สุพรรณบุรี ก็ 1 byte ครับ

enum คืออะไร enum ที่อยู่ใน MySQL นั้น มันคือ field รูปแบบหนึ่ง ที่จะยอมให้เราเก็บข้อมูลเฉพาะที่เราได้กำหนดล่วงหน้าเอาไว้แล้วเท่านั้น เช่น เราสร้าง field enum ขึ้นมา โดยกำหนดให้รับข้อมูลเป็นจังหวัด ในรูปแบบ 76 จังหวัด enum นี้ก็จะเก็บได้แค่ 76 จังหวัด จะมากกว่านี้ไม่ได้ เว้นแต่เราแก้ไข table ซะก่อน (alter table) โดยจะเก็บค่าได้สูงสุด 65,535 รูปแบบ และหากใช้ไม่เกิน 255 รูปแบบ จะใช้พื้นที่จัดเก็บ 1 byte เท่านั้น เกินกว่านั้นใช้ 2 bytes

หลายคนห่วงเรื่องความเร็ว? ไม่ต้องเป็นห่วงเรื่องนี้ เพราะว่าผมค้นหาการทดสอบ และเปรียบเทียบมาแล้วพอสมควร ทำให้ได้ข้อสรุปว่า เมื่อก่อน enum ช้ากว่า varchar แต่ว่าในปัจจุบัน กลับกัน คือ enum ทำงานเร็วกว่า varchar แต่อย่างไรก็ดี ความเร็วของ enum ที่มากกว่า varchar นี้ ไม่มากกว่าอย่างมี นัยสำคัญ ซึ่งผมก็เดาว่าส่วนหนึ่งของความเร็วที่ได้มา เป็นเพราะว่าการเก็บข้อมูลที่เรียบง่ายของ enum เอง และจำนวนข้อมูลเก็บที่มีขนาดเล็กกว่าด้วย แต่อย่างน้อยก็ทำให้เรามั่นใจได้ว่า เปลี่ยนจาก varchar มาใช้ enum ไม่มีปัญหาเรื่องความเร็วแน่นอน 

แต่อย่างที่ได้บอกเอาไว้แล้ว ว่าเอา enum มาแทนทุกกรณีไม่ได้ เพราะว่า enum จะแทนได้เฉพาะกรณีที่มีค่าตายตัว รูปแบบเดิมๆซ้ำๆเท่านั้น อะไรที่ user ต้องกรอก ก็ปล่อยให้เป็นหน้าที varchar , text เหมือนเดิมนั้นล่ะ จังหวัดเราก็ทำเป็น drop down ให้เลือกเอา โดยดึงมาจากอีก table ที่เก็บ จังหวัดในรูปแบบ enum ก็ได้ ประหยัดดี

ท้ายนี้ผมหวังว่า ไม่มีใครจะเอาไปเก็บตัวเลขจำนวนเต็ม เช่นจำนวนเงินนะ เพราะเห็นว่ามันประหยัดพื้นที่ดี เพราะว่าถ้าจะเก็บตัวเลข ทำไมไม่ใช่ field type ที่เป็น numeric เช่น tinyint , smallint  ไปล่ะ ใช้พื้นที่เท่ากัน เก็บได้มากกว่ากันเยอะ แถมสร้างได้ง่ายกว่าอีกต่างหาก เลือกใช้กันให้ถูกงานด้วยครับ

[PRINT VERSION] เขียน: 2010-08-18 10:57:05 แก้ไข : 2010-08-18 10:57:05 อ่าน : 2898
tag : mysql speed up, mysql reduce storage, mysql enum, mysql varchar, mysql , enum datatype, enum datafield

Comment

Comment
BeYourCyber - 18/08/2010 09:57:05 -
ร่วมพูดคุยในหัวข้อของบทความ ไม่สนใจใช้ enum เหรอ ประหยัดกว่ากันเยอะนะ
เป็น data field ที่มีมาให้ใน MySQL (และอีกหลายค่าย) แต่ว่าหลายคนแทบไม่ได้ใช้ หรือไม่เคยใช้เลย มาทำความรู้จักก่อนดีมั้ย แล้วคุณจะหลงรัก
kakarot - 26/09/2010 13:29:16 - 118.172.167.158
แล้วมีวิธีการใข้อย่างไรบ้างครับ
เช่นการรับค่ามาจากฟอร์ม และการนำ้มาแสดง เป็นต้นครับ
BeYourCyber - 26/09/2010 22:27:24 - 124.121.127.159
หลังจากที่เราสร้างแล้ว เวลาใช้ ไม่ว่าจะ insert , update ให้เรามองว่ามันเป็น text field ธรรมดาเลยครับ แต่ข้อมูลที่จะเข้าไปเก็บ ก็ต้องอยู่ในขอบเขตของ enum ที่เราสร้างไว้ก่อนแล้วเท่านั้นครับ
เช่นตอนสร้าง ให้มี aaa bbb ก็จะต้องมีเฉพาะค่า aaa หรือ bbb เท่านั้นครับ

ส่วนการรับค่า , php ,mysql ให้อ่านได้ที่ http://meewebfree.com/cat/start-website-builder/19
bonparadorn - 11/08/2011 00:06:06 - 110.169.194.178
ถ้าพิมพ์จังหวัดผิดหละครับ อิอิ
BeYourCyber - 12/08/2011 18:28:43 - 115.87.31.208
ปกติ จังหวัด ผมจะมีตารางเก็บ หรือ เขียนเป็น library เตรียมไว้

เวลาแสดงหน้าเว็บ จะแสดงเป็น drop down list ให้ user เลือกเลย ไม่ต้องพิมพ์ครับ เพราะว่าจังหวัดในประเทศจะเกิดการเปลีย่นได้น้อยมาก

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