จะมีวิธีการอย่างไรที่จะแก้ปัญหาเล่านี้ไปเมื่อคุณคิดคำสั่ง 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 จะล่มเอา แต่ถ้าใช้ค่ำสสั่งนี้ใช้เวลาเพียงแค่ไม่ถึงวินาที (ข้อมูลหลักล้าน) คับ
ลองเอาไปประยุกต์ใช้---
0 ความคิดเห็น:
แสดงความคิดเห็น