วิธีการประยุกต์ใช้คำสั่ง sql ที่จอยมากว่า 2ตาราง

ผมมีปัญหากับคำสั่ง sql หลาย ๆครั้งที่ผมทำให้มันค้างไปแล้วต้องมา Q process กัน
จะมีวิธีการอย่างไรที่จะแก้ปัญหาเล่านี้ไปเมื่อคุณคิดคำสั่ง query แล้วรันมันมั่นใจแค่ไหนว่ามันจะไม่กระทบกับ database ของคุณ (จนโดนด่า) ผมโดนมาแล้วอิ ๆ ถือว่าเป็นประสบการณ์แล้วกัน

ก่อนอื่นสิ่งที่ต้องเตียมก็คือ data set ข้อมูลของคุณทั้งหมดที่จะต้องนำมาใช้ในการทำงาน ลองนับดูเล่น ๆ มีกี่ GB ขนาดของข้อมูลโครงสร้างของข้อมูล

เท่า ๆที่ผมรู้มาคือ mysam จะเร็วกว่า Inodb
การที่จะเข้าถึง field ใน table ของคุณให้ไว ๆขึ้นนั้นจะต้องมีอะไรบ้าง

  • PK 
  • FK 
  • INDEX
  • Unique

 จากประสบการณ์ของผมที่ที่ไม่เซ็ค index ให้กับ Field ปรากฏว่าความไวต่างกันมาก ขนาดของข้อมูลที่ผมดูอยู่คือ หลักล้าน เกือบ สองล้านระเบียน ซึ่งแน่นอนกว่าใช้ค่ำสั่ง query ต้อง optimiz มันดี ๆ

ที่ค้นพบอีกอย่างคือการหาวันเดือนปีโดยใช้คำสั่ง DATE_FORMAT('FIELD_NAME','%Y-%m-%d'); แบบนี้จะสามารถทำงานได้ไว้กว่าใช้ ='y-m-d' ธรรมดาอย่างมาก

เรื่องของการหาวันที่ก็เหมือนกัน mysql เองสามารถทำได้มากกว่าที่คิดสามารถหาได้ว่าเป็นวันที่เท่าไหร่ของสัปดาห์ ต่างกันกี่วัน date_diff(); day_of_week ,day_of_year ; หรือ ชั่วโมง นาที วินาที มิลิวินาทีก็ได้แล้วแต่เราจะต้องการหาค่าอะไร เพื่อลดการทำงานของการเขียนโค๊ตมากที่สุด สามารถนำผลลัพที่ได้จากการ Query เพียงครั้งเดียวไปใช้งานได้เลย


เทคนิคการ JOIN มากกว่าสองตารางโดยไม่ต้องมีคำว่า JOIN : Exsam inner join, left join ,right join เองก็ตาม พบว่า คำสั่งที่กิน Ram ใช้เวลานานสูงสุดคือ INNER JOIN นั้นเองไม่จำเป็นอย่างใช้คำสั่งนี้ ถ้าข้อมูลคุณมีปริมาณที่มาก หลักแสนหรือล้านรับรองได้ว่าไม่รอดแน่ ๆ และการออกแบบ DB ไม่ผ่านการ Normalization มา รับรองว่าตายทั้งโคตร
ถ้าจะใช้จริง ๆ ควรเลือก left join หรือ right join เท่านั้นและอย่างลืม set index ให้มันด้วยแต่ละฟิวที่ reference กันอยู่


  • เทคนิคการ Group by : อันนี้เป็นเทคนิคที่น่าสนใจตรงที่เวลาตงการหาข้อมูลเป็นกลุ่ม ๆ แล้วแต่คุณจะแบ่งกลุ่มยังไง ก็ได้ ตามข้อมูลที่คุณมีอยู่ แต่สิ่งหนึ่งที่ขาดไม่ได้ อย่าลืม COUNT('FIELD') เข้าไปด้วยน่ะ ไม่งั้นการ Group by เป็นเรื่องใหญ่ แน่ ๆ
  • เทคนิคการ Group โดยใช้วันเดือนปี แต่ FIELD ของคุณเก็บเป็น DATE_TIME อยุ่ มันไม่ได้มีแค่วันเดือนปีสิครับแต่มันมีเวลาเข้ามาเกี่ยวข้องด้วยแล้วจะทำอย่างไรให้ได้เพียงแค่วันแล้วนับจำนวนแล้วเรียงตามวันแบ่งเป็นกลุ่ม ๆออกมา วิธีการง่าย ๆคือ ใช้คำสั่ง Group by 'file_date_time' นั้น ๆ แล้ว ใช้คำสั่งนี้ group by date_format('field_date_time','%Y-%m-%d') > 'xxxx-xx-xx' ; เพียงเท่านี้เวลาก็ไม่ถูกนำมาคิดแล้วครับจะได้แค่วัน สามารถไปประยุกค์แบ่งตามเดือนก็ได้น่ะครับ แต่ก่อนหน้านั้นอย่าลืม count('pk_field') ก่อนน่ะครับเพื่อจะได้หาจำนวนออกมาให้ได้ เทคนิคนี้สามารถนำไปประยุกค์ได้หลาย ๆอย่างอีกเช่นเคย สักแล้วแต่คุณจะคิด
  •  
เทคนิคการ JOIN แบบไม่ต้องมีคำว่า JOIN อันนี้ผมว่าเด็จมากแหละ Query ได้เร็วมากที่สุดแล้ว แล้วได้จำนวนตารางไม่จำกัดด้วย
  • SELECT a.`customer_id` , b.`email` 
    FROM `order_info` a, `member_info` b
    WHERE a.`customer_id` = b.`member_id` 
  • เช่นตัวอย่างนี้เป็นการจอยเพียงแค่ผมอยากได้ email ซึ่งมันไปอยู่อีกตารางหนึ่งถ้าผมทำ inner จอยได้ข้อมูลจริง แต่ว่าใช้เวลาประมาณ 25 กว่าวินาทีใจแทบขาด กลัวว่า DB จะล่มเอา แต่ถ้าใช้ค่ำสสั่งนี้ใช้เวลาเพียงแค่ไม่ถึงวินาที (ข้อมูลหลักล้าน) คับ 
ลองเอาไปประยุกต์ใช้---


Share on Google Plus

About maxcom

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 ความคิดเห็น:

แสดงความคิดเห็น