แบบอยากรู้ว่า เวลาเลือก หาข้อมูลจาก ข้อมูลจำนวนมาก

แบบอยากรู้ว่า เวลาเลือก หาข้อมูลจาก ข้อมูลจำนวนมากๆ มันมี trick หรือเปล่าครับ

แบบตอนนี้ มีปัญหาคือ ผมทำระบบค้นหาข้อมูลจาก record แสนกว่า อันนะครับ
เช่น หา คนที่ ขึ้นต้นด้วย ก หรือ a อะไรประมาณนี้
กด search ที เครื่อง ทำงาน หนัก พอสมควรเลย
ถ้า หา พร้อมกันหลายคน จะยิ่งหนักมากก
เลยไม่รู้ปกติ code sql มันมี trick ในการ ค้นหาหรือเปล่าครับ

ของผมตอนนี้คือ
select * from member where firstname like ‘%$search%’

มันน่าจะมี ดีกว่านี้ไหม ขอบคุณครับ

เช่น หา คนที่ ขึ้นต้นด้วย ก หรือ 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 ได้ด้วย

ลองดูครับ

:slight_smile:

อย่างที่คุณ 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 ดีแล้ว มันไม่เกินกำลังเครื่องก็ยังไม่จำเป็นเท่าไหร่ นอกจากมีผู้ใช้จำนวนมาก

ตกไปหน่อยครับ

เรื่องของ table structure ก็สำคัญ field ที่ทำการค้นหาบ่อยๆ ก็ควรจะเป็น index field

ครับที่ถูกควรทำเป็น INDEX นอกจากนี้แล้ว หากข้อมูลไม่ได้ update ควรพิจารณาวิธีการ caching ด้วย

แนะนำ database abstraction library ที่ชื่อ ADOdb

PHP กับ ADOdb

ADODB,PEAR DB,MDB,dbx,Metabase Native Benchmark

ขอเพิ่มเติมในส่วนของการแสดงผล หลังจากที่ Query ข้อมูลได้แล้วควรแงออกเป็นหน้า ๆ ครับ

ยอดเยี่ยมทุกท่านเลยครับ ควร PIN กระทู้นี้อีกแล้ว

edit: คิดอีกที ย้ายไปอยู่ how-to เลยดีกว่าครับ ไม่ต้อง PIN

ว่าแต่ว่า คุณ standhost ว่างๆ กลับมาช่วยเกลาอีกทีนะครับ :slight_smile:

แนะนำ database abstraction library ที่ชื่อ ADOdb

ไงๆก็มาแล้วก็ถามต่อเลยนะครับ

PHP กับ ADOdb มันทำให้ประสิทธิ์ภาพ การทำงานดีขึ้นมากไหม หรือคิดเป็นกี่ % อ่ะครับ

ขอบคุณครับ :angel:

ให้ 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 นาที เป็นต้น