วันศุกร์ที่ 22 พฤษภาคม พ.ศ. 2552

MyISAM เร็วกว่า InnoDB จริงหรือ? (Part 1)

และแล้วในที่สุด Blog ของเราก็มีคนมาอ่านแร้ววว 1 คนแหนะ (-*-) นั่นก็คือ จิต เพื่อนที่มหาลัย ที่ตอนนี้ทำงานอยู่บริษัท Database ชั้นนำแห่งหนึ่ง และเนื่องจากบทความที่จะเขียนนี้เกี่ยวกับเรื่องของ Storage Engine ของ Database ทำให้ผมชักเกร็งๆแล้วว่าจะเขียนดีมั้ย ก็เลยกั๊กไว้อยู่นานไม่โพสซะที แต่ในที่สุดก็ทำใจได้แล้ว ถ้าผิดพลาดประการใดก็ช่วยแนะนำด้วยนะคร้าบบบ

ก่อนอื่นก็ต้องขอบอกก่อนเลยว่าบทความนี้ผมไม่ได้ทดสอบเอง แต่เป็นการแปลมาจากBlog ของต่างประเทศอีกทีหนึ่งคือ http://www.mysqlperformanceblog.com ซึ่งผู้เขียนเห็นว่าน่าสนใจทีเดียวจึงนำมาแปลและเรียบเรียงตามความเข้าใจของผู้เขียน หากผิดพลาดประการใดก็ขออภัยด้วยนะคับ

จริงๆแล้วจุดประสงค์หลักของการทดสอบนี้จะเป็นเรื่องของ Storage Engine 3 ตัวคือ Falcon, MyISAM, InnoDB ซึ่งตอนที่บทความต้นฉบับนี้เขียนขึ้นนั้น(ปี2007) Falcon พึ่งจะออกมาเป็น Version Alpha ดังนั้นจุดที่น่าสนใจของบทความผู้เขียนว่าน่าจะเป็นที่จุดประสงค์รองมากกว่า

โดยจุดประสงค์รองของการทดสอบครั้งนี้อยู่ที่ เรื่องราวเกี่ยวกับ MyISAM นั้นเร็วกว่า InnoDB ในเรื่องการอ่านจริงหรือ อย่างที่รู้กันว่า InnoDB ทำงานแบบ Transaction และ Support Foreign Key จึงมี overhead มากกว่า ทำให้มีการพูดกันว่า InnoDB ช้ากว่า MyISAM ความจริงทั้งหมดคุณจะได้เห็นจากการทดลองนี้

การทดสอบใช้ PHPTestSuite
สคริปและชุดคำสั่งที่ใช้ทดสอบอยู่ที่นี่

Table ที่ใช้ทดสอบเป็น Table แบบทั่วไปที่ปกติที่จะใช้กันบน OLTP หรือ Web App
Medium Size Rows, Auto Increment
Primary Key and Couple of Extra Indexes

ในการทดสอบครั้งนี้จะใชการ read(select) ด้วย pattern ในการอ่านหลายรูปแบบ
Primary Key Single Row Lookup, Primary Key Range Lookup, Same Access Types
for Primary Key and Full Table Scans.

เพื่อที่จะเน้นให้เห็นถึงคุณสมบัติที่แตกต่่างกันของ Storage Engine เราจะทดสอบด้วย Range ด้วยการใช้และไม่ใช้ LIMIT

การเปรียบเทียบประสิทธิภาพครั้งนี้จะเรียกว่าการเปรียบเทียบระสิทธิภาพแบบ Micro ที่คำนึงถึงฟังก์ชันที่สำคัญๆของ Storage Engine เป็นหลัก และจะใช้มันเพื่อดูประสิทธิภาพและ Scalability ในกรณีง่าย และการทดสอบนี้ได้มีการใช้ CPU bound workload ด้วย(การทำแบบไม่ใช้ I/O disk เลย) เพื่อที่จะดูประสิทธิภาพของ Storage Engine ในเรื่องของการใช้ CPU

ดูคำอธิบาย schema และ queries ที่นี่
CentOS release 4.4 (Final)
2 х Dual Core Intel XEON 5130 model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz
stepping : 6 cpu
MHz : 1995.004
cache size : 4096 KB
16GB of RAM

MySQL version ใช้ MySQL 5.1.14-beta sources for MyISAM / InnoDB และ MySQL 5.1.14-falcon bitkeeper tree bk://mysql.bkbits.net/mysql-5.1-falcon สำหรับ Falcon (ในบทคามนี้จะใช้ falcon ที่เป็น version alpha อยู่ ซึ่งในปัจจุบันอาจมีการเปลี่ยนแปลงไปมากแล้ว)

Compilation parameters:

For MyISAM / InnoDB
./configure --prefix=/usr/local/mysqltest/mysql- --with-innodb
For Falcon
./configure --prefix=/usr/local/mysqltest/mysql- --with-falcon

MySQL Startup Parameter

Falcon:
libexec/mysqld --no-defaults --user=root --falcon_min_record_memory=1G --falcon_max_record_memory=2GB --falcon_page_cache_size=1500M --max-connections=1500 --table-cache=512 --net_read_timeout=30 --net_write_timeout=30 --backlog=128
MyISAM / InnoDB:
libexec/mysqld --no-defaults --user=root --key-buffer-size=1500M --innodb-buffer-pool-size=1500M --innodb-log-file-size=100M --innodb-thread-concurrency=8 --max-connections=1500 --table-cache=512 --net_read_timeout=30 --net_write_timeout=30 --back_log=128

ขั้นตอนการทำ Benchmark
1. เตรียม table ขนาด 1,000,000 record ขนาดประมาณ 350Mb
2. Run แต่ละ Query ด้วย Thread 1, 4, 16, 64, 128, 256
3. แต่ละ Thread จะทำการ warm-up run ใช้เวลาประมาณ 180 วินาที และรัน effective run 3 ครั้ง ดังนั้นผลลัพธ์สุดท้ายที่ได้จะได้ผลลัพธ์สูงสุดของการรันทั้ง 3ครั้ง

ข้อมูลของการรันเป็นไปตาม link นี้
http://www.mysqlperformanceblog.com/files/benchmarks/innodb-myisam-falcon.html


ผลลัพธ์ที่ได้เป็นไปตามภาพพร้อมการสรุปผล

READ_PK_POINT


Query: SELECT name FROM $tableName WHERE id = %d
Comment: เป็นการรัน query ด้วยการ access ผ่าน primary key
InnoDB เร็วกว่า MyISAM 6-9%
Falcon แสดงถึง Scalability ที่แย่มาก

READ_KEY_POINT


Query: SELECT name FROM $tableName WHERE country_id = %d
Comment: ในกรณีนี้ Falcon ทำได้ดีที่สุด เพราะ Falcon ใช้เทคนิคพิเศษในการดีง rows ออกมา
ในขณะที่ MyISAM แสดงถึง Scalability ที่แย่เมื่อจำนวน Thread เพื่มขึ้น คิดว่าน่าจะเนื่องมาจาก pread system call ที่ MyISAM ใช้ในการ Access Data และการดึงมาจาก OS ไม่สามารถถูก Scale ได้

READ_KEY_POINT_LIMIT


Query: SELECT name FROM $tableName WHERE country_id = %d LIMIT 5
Comment: ใช้ Query เดียวกับอันก่อนหน้านี้ แต่เพิ่ม Limit ลงไป
เนื่องมาจากวิธีการ access key ของ falcon ในขณะที่บทความนี้ออกยังไม่รองรับการใช้ Limit ดังนั้นกราฟของ Falcon จึงเป็นอย่างที่เห็น แต่ในปัจจุบันอาจจะสามารถใช้ได้แล้วก็ได้
MyISAM แสดงถึงผลลัพธ์ที่เสถียร
InnoDB แสดงดีกว่า MyISAM 58% ในกรณีที่ใช้ 4 thread แต่ความสามารถในการ scale ยังไม่ดีพอ บางทีนี่อาจจะยังคงเป็นปัญหากับการทำ InnoDB mutexes

READ_KEY_POINT_NO_DATA


Query: SELECT state_id FROM $tableName WHERE country_id = %d
Comment: Query นี้คล้ายกับ Query READ_KEY_POINT แต่ต่างกันอยู่ที่ค่าของ column ที่ถูก access นั้นถูกจัดเก็บใน key
MyISAM และ InnoDB จัดการกับกรณีนี้โดยการ retrive มาเฉพาะ key
InnoDB ดีกว่า 25-30%

READ_KEY_POINT_NO_DATA_LIMIT


Query: SELECT state_id FROM $tableName WHERE country_id = %d LIMIT 5
Comment: Query เหมือนอันก่อนหน้านี้แต่เพิ่ม LIMIT ลงไป
Limit กับ Falcon ผลลัพธ์ยังคงเหมือนเดิม
InnoDB ดีกว่า MyISAM ประมาณ 87% ในกรณีใช้ 4 thread แต่ตกลงมาอย่างมากเมื่อเพิ่มจำนวน thread

READ_PK_POINT_INDEX



Query: SELECT id FROM $tableName WHERE id = %d
Comment: ง่ายแต่เร็วนการดึงค่ามาจาก PK
ผลของ InnoDB และ MyISAM พอจะเทียบกันได้ และคิดว่านี่เป็นการแสดงถึงว่าทั้ง 2 engine นั้นถูกทำให้ optimize อย่างถึงที่สุด ผลลัพธ์ที่ได้คือผลลัพธ์ที่ดีที่สุดที่สามารถเป็นไปได้
Falcon scale ได้ไม่ค่อยดี แต่มันยัง optimize ได้อีกเยอะ

READ_PK_RANGE


Query: SELECT min(dob) FROM $tableName WHERE id between %d and %d
Comment: เข้าถึงด้วย range ด้วยค่าของ primary key
MyISAM scale ได้แย่มาก และเหตุผลก็เป็นเหตุผลเดียวกับ READ_KEY_POINT
InnoDB ดีกว่า MyISAM 2-26 เท่าและมากกว่า Falcon 1.64 - 3.85 เท่า

READ_PK_RANGE_INDEX


Query: SELECT count(id) FROM $tableName WHERE id between %d and %d
Comment: MyISAM scale ได้ดีเนื่องจาก access แค่ column ที่เป็น key และ pread system call ไม่ได้ถูกใช้

READ_KEY_RANGE


Query: SELECT name FROM $tableName WHERE country_id = %d and state_id between %d and %d
Comment: ในทำ READ_KEY_RANGE Falcon ทำได้ดีที่สุด
Falcon ทำได้ดีกว่า InnoDB 10-30%
MyISAM ตกลงเมื่อ thread มีจำนวน 128-256

READ_KEY_RANGE_LIMIT


Query: SELECT name FROM $tableName WHERE country_id = %d and state_id between %d and %d LIMIT 50
Comment: Falcon ตกไปอีกครั้ง เพราะไม่ support LIMIT

READ_KEY_RANGE_NO_DATA


Query: SELECT city FROM $tableName WHERE country_id = %d and state_id between %d and %d

READ_KEY_RANGE_NO_DATA_LIMIT


Query: SELECT city FROM $tableName WHERE country_id = %d and state_id between %d and %d LIMIT 50

READ_FTS


Query: SELECT min(dob) FROM $tableName
Comment: เป็น query ที่ถึกที่สุดก็ว่าได้ เพราะต้อง scan ทั้ง 1 ล้าน row
InnoDB ดีกว่า MyISAM ประมาณ 30% ถ้าใช้ 4-16 Thread แต่ MyISAM scale ได้ดีกว่าเล็กน้อยในกรณีนี้
InnoDB ดีกว่า Falcon 2-3 เท่า

และแล้วก็จบสำหรับบทความนี้ ผู้อ่านบางท่านอาจจะงงๆอยู่บ้าง(เพราะผู้เขียนก็ยังงงๆเหมือนกัน - -') ยังไงหาสงสัยสามารถเข้าไปดูต้นฉบับได้ที่นะคับ
http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

บทความนี้ก็ขอลาไปเท่านี้ก่อน แต่เรื่องราวของ MyISAM vs InnoDB ยังไม่จบ ไว้ต่อ Part 2 ในบทความหน้า ซึ่งเป็นบทความที่แปลมาอีกเช่นกัน เขียนขึ้นในปี 2008 เป็นการวิเคราะห์คุณสมบัติและความเหมาะสมของทั้งสองตัวนี้ อีกทั้งยังมีการอ้างอิงมาถึงบทความนี้อีกด้วย แล้วคอยติดตามกันคร้บบบ หุหุ

วันเสาร์ที่ 2 พฤษภาคม พ.ศ. 2552

การตั้งค่า MySQL ให้ใช้ "ภาษาไทย" ได้ร่วมกับ ASP.NET

วันนี้จะมาดูเรื่องเกี่ยวกับการ Set ภาษาไทยของ MySQL ที่ใช้ร่วมกับ ASP.NET กันครับ หลังจากที่นั่ง Set อยู่นานแสนนานกว่าจะได้ ลองมาหลายวิธีเหมือนกัน เรียกว่า Search หากันหัวบานเลยทีเดียว

สำหรับการ Config นี้จะเป็นการ Config สำหรับ MySQL version 5 ขึ้นไปนะคับ ซึ่งจากเดิมที่เวอร์ชันเก่าๆจะใช้ character set เป็น tis_620 และใช้ collation เป็น tis_620_ci ก็จะเปลี่ยนมาใช้เป็น utf8 ทั้งหมด

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

อันนี้ทำตั้งแต่ช่วงติดตั้ง หรือหลังจากติดตั้ง MySQL และมา Config ทีหลัง ให้ทำการเลือกที่ Manual Select Default Character Set แล้วเลือก utf8 ตามภาพครับ


อันต่อไปก็ทำใน web.config ครับ ตามนี้ครับ

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="th-TH" uiCulture="th-TH"/>

ส่วนต่อไปเป็นการ set ใน MySQL ครับ บางครั้งอาจ set มาเป็นอย่างนี้อยู่แล้ว แต่เพิ่มความมั่นใจลองเช็คดูก่อนก็ไม่เสียหาย จากรูปด้านล่างเป็นตัวอย่างจาก MySQL front ครับ

ตัวอย่างคำสั่งในการ Set Character Set
SET character_set_client = utf8

ต่อไปคือกำหนดค่า character set ของ database เป็น utf8 ครับ ด้วยคำสั่ง
ALTER DATABASE web CHARACTER SET utf8
และสุดท้ายเวลา Create Table ควรกำหนด Character Set ให้กับ Table ด้วย เช่น
CREATE TABLE table_name(col1 datatype, col2 datatype, ...
) DEFAULT CHARSET=utf8;
หากยังไม่ได้ก็ให้ลองเช็คแต่ละ column ดูว่าเป็น utf8 รึเปล่า หากไม่ก็สามารถเปลี่ยนได้ด้วยคำสั่ง
ALTER TABLE table_name MODIFY COLUMN col_name datatype character set utf8
เพียงเท่านี้ก็น่าจะใช้ภาษาไทยบน MySQL ร่วมกับ ASP.NET ได้อย่างไม่มีปัญหาแล้วครับ วันนี้ก็ขอจบเพียงเท่านี้ครับ หากใครมีคำแนะนำอะไรเพิ่มเติมก็โพสแนะนำได้นะครับ

ปล: คราวหน้าจะมาเขียนเรื่อง "MyISAM เร็วกว่า InnoDB จริงหรือ?" แล้วคอยติดตามกันครับ หุหุ

วันศุกร์ที่ 1 พฤษภาคม พ.ศ. 2552

บทความแรก กับ แรงบันดาลใจให้เขียน Blog นี้ ^0^

และแล้ววันนี้ก็ได้ฤกษ์เขียน Blog ของตัวเองซักที ครั้งแรกเลยนะเนี่ยที่ตั้งใจจะเขียน เคยมีเพื่อนมาชวน เข้าไปสมัครสมาชิก กดๆสองทีก็ออก เพราะไม่รู้จะเขียนอะไรดี เคยเข้าไปอ่านของเพื่อนๆที่เค้าเขียนเป็นประจำ อ่านๆดูก็เพลินดี ส่วนใหญ่ก็จะเขียนเรื่องว่า ไปเที่ยวไหนมา เรื่องราวเกี่ยวกับตัวเองซะส่วนใหญ่ แต่ก็มีบางคนนะที่เขียนเกี่ยวกับเรื่องทั้วไป ไม่ว่าจะเป็นการเมือง ข่าวคราว ดารา นักร้อง แต่ก็นั่นแหละ รุสึกว่ายังไม่มีแรงจูงใจให้เขียนอยู่ดี

ผมเองเป็น Programmer จบวิดยาคอมฯ ทำงานมาจนถึงวันนี้ก็ได้ประมาณ 7-8 เดือนแล้ว เริ่มเบื่อกับงานที่ทำบ้างเล็กน้อย เพราะมันเริ่มซ้ำเดิมไม่มีอะไรใหม่ งานที่ทำก็ใช้ .NET เป็นหลัก ว่างๆก็เลยหาอะไรมาดูเสริม และแล้วก็สนใจเรื่องเขียนเวปขึ้นมา ด้วยเหตุผลบางประการ แต่ตัวเองก็ยังไม่ค่อยมีความรู้ในเรื่องนี้เท่าไรนัก ก็เลยเริ่มไปซื้อหนังสือมาอ่าน เป็นสอนเขียนเวปด้วย ASP.NET 2.0 ฉบับที่แปลมา และตอนช่วงที่ว่างงาน (หมายถึงว่าเค้ายังไม่มีอะไรให้ทำนะ ไม่ใช่ตกงาน --') ก็เลยนั่งเปิดดูเวปที่เค้าสอนเขียนเวปบ้าง Search ไป Search มา ก็มักจะเจอกับบทความต่างๆที่เค้า วิเคราะห์ วิจารณ์ หรือ ให้ความรู้เกี่ยวกับเรื่องพวกนี้บ้าง ซึ่งส่วนใหญ่ก็จะเป็นเวปนอกทั้งนั้นเลย

ความรู้สึกอยากเขียนก็เริ่มมาจากตรงนี้แหละ เพราะคนไทยไม่ค่อยมีเรื่องพวกนี้บ้างเลย(หรืออาจจะมีแต่ผมไม่เจอก็ได้) ส่วนใหญ่ถ้าพูดถึงเขียน Blog ผมก็จะนึกถึง Blog ที่เล่าเรื่องราวหรือประสบการณ์ที่คนๆนั้นพอเจอมามากกว่า (ซึ่งผมว่ามันก็ดีนะคับ หลายบทความให้ข้อคิดความเพลิดเพลินและอะไรหลายๆอย่างดีทีเดียว) แต่ไม่ค่อยเจอ Blog ที่เป็นการ Shared ความรู้เท่าไร ก็เลยเกิดความคิดว่าอยากจะ Shared ความรู้ที่ได้อ่านมาพร้อมๆกับการเริ่มต้นเขียน Web ที่ตัวเองกำลังศึกษาอยู่กับคนอื่นบ้าง ดีไม่ดี ผิดถูกก็ไม่เป็นไร แต่ได้สร้าง Community กับคนที่สนใจมันก็ไม่เลวเหมือนกัน

ซึ่งสิ่งที่ผมจะมาเขียนใน Blog นี้จะคงจะเป็นเรื่องของ ASP.NET กับ MySQL นะคับ เป็นสองตัวที่ผมใช้อยู่ อาจจะมีเรื่องของ CSS หรือ JavaScript ด้วยก็ได้ ที่เลือก ASP.NET นั้นเพราะชอบเครื่องมือและ Technology ของ Microsoft ที่ทำมาแล้วใช้ได้ค่อนข้างสะดวก(ถึงบางครั้งราคาจะไม่สะดวก -*-) แล้วก็เป็นภาษาที่ใช้เขียนอยู่ทุกวันด้วย ส่วนที่เลือกใช้ MySQL ก็เพราะมันฟรีนี่เอง ตัว SQL Server ของ Microsoft ก็น่าใช้ แต่ด้วยข้อจำกัดของ Version ฟรี ที่ให้ใช้พื้นที่ได้แค่ 4GB กับ Memory 1GB ก็เลยตัดสินใจเลือก MySQL ครับ (เหตุผลง่ายๆสั้นๆคือไม่มีตังค์นั่นเอง)

ทั้งหมดนี้ก็เป็นที่มาและแรงบันดาลใจที่ดูรวบรัดไปหน่อย แต่มันก็ได้ได้ทำให้เกิดเป็น Blog นี้ขึ้นมาด้วยประการละฉะนี้แล

หากมีใครหลงแวะเวียนเข้ามาอ่าน(โดยเฉพาะผู้รู้ทั้งหลาย)ก็อย่าลืมแนะนำติชมด้วยนะคับ หุหุ

ASP.NET กับคุณสมบัติ User Authentication และ User Profile บน MySQL

วันนี้เราจะดูเรื่อง คุณสมบัติ User Authentication และ User Profile ที่ ASP.NET จัดเตรียมไว้ให้สำหรับจัดการเกี่ยวกับการจัดการกับ User ซึ่งคุณสมบัตินี้สามารถใช้ได้กับ Database ได้หลายชนิด ที่สำคัญสามารถใช้กับ MySQL ได้อีกด้วย

ASP.NET มี Feature พิเศษสำหรับจัดการกับระบบสมาชิกและ User Profile ที่สามารถจัดการได้ตั้งแต่ สร้าง User, กำหนด Role, การ Login, การกู้คืนพาสเวิร์ด ฯลฯ ที่เกี่ยวข้องกับ User โดยที่เราแทบไม่ต้องเขียน Code ในการจัดการเรื่องพวกนี้เองเลย เพียงแค่ Config ค่าต่างๆให้ถูกต้องก็สามารถใช้งานได้แล้ว

ซึ่งคุณสมบัติดังกล่าว มิได้มีให้เฉพาะสำหรับ SQL Server เท่านั้น แต่ทาง Microsoft ได้มีการกำหนด รูปแบบของคลาส Provider ที่ใช้จัดการกับระบบสมาชิกและ User Profile ไว้ เพื่อให้ผู้พัฒนาระบบฐานข้อมูลที่สนใจสามารถเขียน Plug-in Provider นี้เพื่อใช้งานกับ ASP.NET ได้ ซึ่ง MySQL ก็มีการทำ Plug-in ตัวนี้ไว้

ขั้นตอนในการใช้คุณสมบัติดังกล่าวสามารถทำได้ดังนี้
1. ดาวโหลด MySQL Connector Net และติดตั้ง ซึ่งตัวนี้เป็นตัวที่ใช้สำหรับติดต่อระหว่าง .NET กับ MySQL
2. ทำการ Add reference ไปยัง MySql.Data.dll และ MySql.Web.dll
3. ทำการ Create table ใน MySQL ด้วย code นี้
4. ทำการ Config Provider ที่จะใช้ในไฟล์ web.config --> system.web ดังนี้

กำหนด Membership Provider และ Set ค่าต่างๆ

หมายเหตุ defaultProvide กับ name สามารถใส่ชื่ออะไรก็ได้ที่คุณต้องการ เพื่อใช้สำหรับอ้างอิงเท่านั้น

กำหนด Role Provider และ Set ค่าต่างๆ

หมายเหตุ defaultProvide กับ name สามารถใส่ชื่ออะไรก็ได้ที่คุณต้องการ เพื่อใช้สำหรับอ้างอิงเท่านั้น

กำหนด Profile Provider และ Set ค่าต่างๆ

หมายเหตุ defaultProvide กับ name สามารถใส่ชื่ออะไรก็ได้ที่คุณต้องการ เพื่อใช้สำหรับอ้างอิงเท่านั้น

เมื่อมาถึงขั้นตอนนี้ก็สามารถใช้คุณสมบัติ การจัดการกับการกับระบบสมาชิกและ User Profile ใน ASP.NET ได้แล้ว

การใช้งาน Control ในหมวด Login คุณสามารถลาก Control ในหมวด Login มาใช้งานได้เลยโดยไม่ต้องเขียน Code ติดต่อกับฐานข้อมูลแต่อย่างใด เพราะตัว Provider ที่ MySQL Plug มานั้นจะจัดการให้ทั้งหมด เช่น ถ้าต้องการสร้าง User ก็ให้ลาก Control CreateUserWizard ลงมาวางไว้ในหน้าเวปเพจที่ต้องการ


จากรูปด้านล่าง ผมลาก Control CreateUserWizard ลงมาไว้ในเวปเพจที่ใช้ในการลงทะเบียน ทำการ Config ค่าเล็กน้อยพร้อมกับตกแต่งอีกนิดหน่อย เมื่อมีผู้ใช้งานเข้ามาที่เวปเพจสำหรับลงทะเบียน ทำการกรอกข้อมูล แล้วกด "ลงทะเบียน" ตัว ASP.NET ก็จะทำการ สร้าง User ให้เองโดยที่ผมไม่ต้องเขียน Code แม้แต่บรรทัดเดียว


ต่อไป เป็นตัวอย่างการใช้งาน User Profile ที่ตัว ASP.NET จะทำเป็น Strong Type ให้ซึ่งจะได้คุณสมบัติของ IntelliSense ของ .NET ด้วย ตามภาพข้างล่างนี้

จะเห็นว่ามี Properties ต่างๆที่เราได้กำหนดไว้ในไฟล์ web.config ก่อนหน้านี้ปรากฎขึ้นมา ทำให้สะดวกในการเขียน Code ในระดับนึงเลยทีเดียว

ตัวอย่างการใช้งาน Profile Provide คุณสามารถสร้าง Form เพื่อใช้ในการเก็บข้อมูลของ User จากนั้น Code เบื่องหลัง Page นั้นก็ให้ Set ค่าให้กับตัวแปล Profile จากนั้นใช้ำสั่ง Save มันจะทำการบันทึกข้อมูลของ User คนนั้นลงในฐานข้อมูลโดยที่เราไม่จำเป็นต้องไปเขียน SQL Code เพื่อใช้ในการบันทึก


ตัวอย่างการใช้งาน Role Provide


ตัวอย่างนี้เป็นการได้สาธิตการดึง User ทุกคนที่อยู่ใน Role Administrator ออก Bind เข้ากับ DropDownList (dllAdminUsers)

และ ASP.NET ยังได้มีหน้าที่ใช้จัดการกับ User ให้ด้วย เช่น การกำหนดรายชื่อ User การกำหนด Role ให้กับ User ฯลฯ โดยคุณสามารถกดตรงไอคอนตามรูป

กดตรงนี้


จะขึ้นหน้าเวปตามนี้

สุดท้ายตัวอย่างการกำหนดสิทธิ์สำหรับการเข้าหน้า Page ต่างๆตามสถานะของ User


จาก Config ข้างบน ส่วนแรกเป็นการกำหนดว่าเวปเพจ EditProfile.aspx ห้ามไม่ให้ User ที่เป็น Anonymous User (แทนด้วยเครื่องหมาย "?") หรือก็คือ User ที่ยังไม่ได้ Login นั่นเอง แต่ User ทุกคนที่ Login แล้ว(แทนด้วยเครื่องหมาย "*") สามารถเข้าได้ และส่วนที่สองเป็นการกำหนดว่าหากไม่มีสิทธิ์เข้าแล้วจะให้ Redirect ไปที่ไหน

หมายเหตุ name สามารถใส่ชื่ออะไรก็ได้ที่คุณต้องการ เพื่อใช้สำหรับอ้างอิงเท่านั้น

วันนี้ก็ขอจบการแชร์ความรู้เล็กๆน้อยๆเพียงเท่านี้ ไว้คราวหน้าจะมาอัพเดทต่อนะคับ หุหุ