แบบอยากรู้ว่า เวลาเลือก หาข้อมูลจาก ข้อมูลจำนวนมากๆ มันมี trick หรือเปล่าครับ
แบบตอนนี้ มีปัญหาคือ ผมทำระบบค้นหาข้อมูลจาก record แสนกว่า อันนะครับ
เช่น หา คนที่ ขึ้นต้นด้วย ก หรือ a อะไรประมาณนี้
กด search ที เครื่อง ทำงาน หนัก พอสมควรเลย
ถ้า หา พร้อมกันหลายคน จะยิ่งหนักมากก
เลยไม่รู้ปกติ code sql มันมี trick ในการ ค้นหาหรือเปล่าครับ
ของผมตอนนี้คือ
select * from member where firstname like ‘%$search%’
มันน่าจะมี ดีกว่านี้ไหม ขอบคุณครับ
aicp
2
เช่น หา คนที่ ขึ้นต้นด้วย ก หรือ a อะไรประมาณนี้
กด search ที เครื่อง ทำงาน หนัก พอสมควรเลย
ดูจากตรรกะของคุณ หาแบบนี้มันมาหมดไม่ได้มาเฉพาะแค่ขึ้นต้น
กรกนก
กนกพร
สมเกียรติ
เกรียงไกร
2 ชื่อแรกคือที่ต้องการ แต่จะติดอีก 2 ชื่อที่ไม่ต้องการ
sql คำสั่งตรงไปตรงมา หากจะแก้ให้แก้ที่ php ให้กรองสิ่งที่อนุญาตก่อนเข้าไปค้นหา sql ไม่อย่างนั้น sql ทำงานหนัก เพราะหาแค่อักษรเดียว ยังยอมให้ไปค้นใน sql
วิธีแก้ไขให้คุณคิดนะ ไม่บอกโค้ด แต่จะบอกตรรกะให้ คือ เมื่อหา result ได้ทั้งหมดเท่าไหร่ เอา result ทั้งหมดเขียนเป็น text file แล้วให้ browser ไปอ่านจาก text file แล้วเอา session ไปเกาะ browser ของผู้ใช้ หากผู้ใช้ปิด browser ก็ให้ text file ที่สร้างขึ้นโดนลบไปพร้อมกับ session
และหรือหากผู้ใช้ไม่ปิด browser แต่ search ใหม่ ให้ result เขียนทับ text file เดิม แต่หากปิด browser ก็ให้ผลเป็นแบบที่เขียนไว้ด้านบน
เอาตรรกะนี้ไปเขียนเป็นอัลกอฯ เพื่อความเข้าใจ
นอกเรื่อง เคยตรวจสอบโค้ดที่เขียนหรือเปล่าว่า หากเคาะ spacebar หลายๆ ครั้งก่อนที่จะใส่ keyword การค้นหา 1 คำ หรือ เคาะ spacebar ต่อไปเรื่อยๆ แล้วใส่ keyword อีก 1 คำ แถมเคาะ spacebar ต่อไปอีก และใส่ keyword อีก 1 คำ และเคาะ spacebar ต่อไปอีกสัก 3 - 10 ครั้ง เป็นการสิ้นสุด สามารถหาได้และถูกต้องหรือไม่
หากได้ก็แล้วไป แต่หากรวนก็เป็นปกติ ก็ให้ไปตั้งเขียน php แบบ rule เพื่อตรวจสอบก่อนไปค้นหา ก็จะแก้ไขได้
จากตรรกะทั้งสองข้างต้น record แค่แสนกว่าถือว่าเด็กๆ เพราะตรรกะทั้งสองสามารถรองรับการรวม table การค้นหาได้ที่ใช้อยู่ในปัจจุบันแบบ 110 table และแต่ละ table มีข้อมูลไม่น้อยกว่า 5+ แสน record ได้อย่างสบาย และการค้นหาแบบ advanced and syntax ได้ด้วย
ลองดูครับ
kke
3
อย่างที่คุณ aicp บอกครับ ต้องสร้าง condition จากแบบฟอร์มการค้นหาก่อน
ตรวจสอบข้อความที่พิมพ์เข้ามาก่อนนำไปค้นหาจริง อาจต้องตัด space ออก
หรือแยกเป็นคำๆ ก่อนนำไปสร้าง sql ที่เหมาะสมสำหรับค้นหาคำนั้นๆ
แบบที่คุณยก code มาเป็น code แบบครอบจักรวาร basic สุดๆ จึงไม่แปลกที่มันจะกินกำลังการค้นหา
select * from member where firstname like ‘%$search%’
- – เลือกเฉพาะ field ที่ต้องการใช้งาน ตัดๆออกไปบ้าง
%word% หาที่มีคำว่า word อยู่ในคำ
word% หาที่ขึ้นต้นด้วย word
%word หาที่ลงท้ายด้วย word
เอาแค่ sql ก่อน
ส่วนเรื่องเอา session ไปเกาะ browser สร้าง text file ถ้า sql ดีแล้ว มันไม่เกินกำลังเครื่องก็ยังไม่จำเป็นเท่าไหร่ นอกจากมีผู้ใช้จำนวนมาก
kke
4
ตกไปหน่อยครับ
เรื่องของ table structure ก็สำคัญ field ที่ทำการค้นหาบ่อยๆ ก็ควรจะเป็น index field
pat
5
ครับที่ถูกควรทำเป็น INDEX นอกจากนี้แล้ว หากข้อมูลไม่ได้ update ควรพิจารณาวิธีการ caching ด้วย
แนะนำ database abstraction library ที่ชื่อ ADOdb
PHP กับ ADOdb
ADODB,PEAR DB,MDB,dbx,Metabase Native Benchmark
ขอเพิ่มเติมในส่วนของการแสดงผล หลังจากที่ Query ข้อมูลได้แล้วควรแงออกเป็นหน้า ๆ ครับ
ยอดเยี่ยมทุกท่านเลยครับ ควร PIN กระทู้นี้อีกแล้ว
edit: คิดอีกที ย้ายไปอยู่ how-to เลยดีกว่าครับ ไม่ต้อง PIN
ว่าแต่ว่า คุณ standhost ว่างๆ กลับมาช่วยเกลาอีกทีนะครับ
mr.tong
8
แนะนำ database abstraction library ที่ชื่อ ADOdb
ไงๆก็มาแล้วก็ถามต่อเลยนะครับ
PHP กับ ADOdb มันทำให้ประสิทธิ์ภาพ การทำงานดีขึ้นมากไหม หรือคิดเป็นกี่ % อ่ะครับ
ขอบคุณครับ
pat
9
ให้ links ไป ไม่ตามอ่านต่อเลย :unsure:
จาก ADODB,PEAR DB,MDB,dbx,Metabase Native Benchmark
จะเห็นว่าการเรียกจาก PHP โดยตรงนั้น เร็วสุด เพราะเชื่อมต่อกันโดยตรง
แต่ ADOdb นั้น ช้ากว่า เพราะมันเป็น database wrapper library หรือเป็นชั้นของ database layer เพิ่มขึ้นมากอีก
MySQL server <—> MySQL.dll (PHP engine) <----> ADOdb <------> Busigness logic
เรื่องการ caching เป็นความสามรถหนึ่งของ ADOdb ลองคิดดูว่า
หากมีคน 1000 คน เข้าไป query database จำนวน 20000 records พร้อมกันจะเป็นอย่างไร
Caching ช่วยได้ ด้วยการเก็บ resule เอาไว้ในพื้นที่ชั่วคราว เมื่อมีการ query ข้อเดิม ระบบก็จะดึงข้อมูลไปแสดงผลทันที โดยไม่ได้ติดต่อกับ database เลย และเมื่อมันไม่ได้ติดต่อกับ database ก็จะมีปัญหาในการแสดงข้อมูลล่าสุด โดยปกติ เราสามารถกำหนดเวลาของ cache ได้ เช่น 10 นาที เป็นต้น