
ยกตัวอย่างของการสร้าง index ของตารางนึงครับ
1. Cardinality มันคืออะไรครับ ขนาดของข้อมูล ของ field ต่างๆ ที่นำไปเก็บ index เหรอครับ
2. year, month ,day จัด เป็น primary key ไปแล้ว ทำไมต้องไปจัด index แยกอีกอันนึงต่างหากครับ งงๆ :'(
Primary key ก็เป็น index ชนิดนึง ใน 1 ตาราง สามารถมี primary key ได้คีย์เดียว (หรือกลุ่มเดียว) และต้อง Unique (ไม่ซ้ำ) ด้วย
ส่วน index สามารถมีได้กี่อันก็ได้ และมีซ้ำก็ได้ ยิ่งมี index เยอะก็จะทำให้การค้นหาเร็วขึ้น แต่ก็จะทำให้เปลืองเนื้อที่มากขึ้นด้วย
Cardinality คือ จำนวนแถวของผลลัพธ์ของข้อมูลที่ได้ทำ index ไว้แล้ว ยิ่งค่านี่ต่ำกว่าจำนวนแถวทั้งหมดในตารางมาก จะยิ่งค้นหาเร็วขึ้นมากเท่านั้น
จากตารางตัวอย่างนี้จับ field ทุกอันที่คิดว่าควรจะเป็น index มาทำ primary key แต่ดันติดตรงที่มัดรวมทุกอันเป็น primary key หมดเลย เลยส่งผลให้ เวลาจะค้นหาทีก็ต้องไปค้นจากทุกแถวในตาราง (7แสนกว่าแถว) เทียบกับการแยกทำ index เป็น fieldๆไป เช่น shop_product_index_stat_idx2 เวลาค้นหาก็จะไปหาจากเพียง 291 แถว (แทนที่จะเป็น 7 แสน) ซึ่งเร็วกว่ากันเยอะมาก
ตารางนี้ถ้าให้ผมโม จะได้เป็น
Primary:
shop_id อันเดียวก็พอ
Index1:
product_idIndex2:
day/month/year จะรวมหรือจะแยกก็ได้ แต่ส่วนตัวผมใช้ DATE ฟิลด์เดียวมีครบทั้งสามอย่าง แต่บางทีถ้าไม่ค่อยได้ใช้ก็ไม่ได้ทำ index พวกวันที่เลยครับ
