คำถามแรก
ผมจะมีปัญหากับการ query ข้อมูล ที่มี table มากกว่า 2 เทเบิลโดยใช้ UNION และ UNION ALL
ข้อมูล รวมทั้งหมด 1 แสนข้อมูล
ตัวอย่างแรก
SELECT * FROM entry_2007
UNION ALL SELECT * FROM entry_2008
UNION ALL SELECT * FROM entry_2009
ใช้เวลา 3 sec
ตัวอย่างที่ 2
SELECT * FROM entry_2007
UNION SELECT * FROM entry_2008
UNION SELECT * FROM entry_2009
ใช้เวลา 7 sec
ตัวอย่างที่ 3 ไม่ใช้ * และไม่ query ข้อมูลที่เป็น text
SELECT id,date,title,status FROM entry_2007
UNION ALL SELECT id,date,title,status FROM entry_2008
UNION ALL SELECT id,date,title,status FROM entry_2009
ใช้เวลา 0.7
ตัวอย่างที่ 4 ไม่ใช้ UNION
SELECT * FROM entry_2007
ใช้เวลา 0.07
มัน มีปัญหากับ ข้อมูลที่มี type เป็น text หรือป่าว ผมอยากจะใช้ varchar แต่มันเกิน 255 แต่ไม่ถึง 1000 แต่บางครั้งก็ไม่ถึง 100 ด้วยซ้ำ
MySQL 4.1
แต่ถ้าใช้ MySQL 5 แล้วใช้ Create view มันจะเร็วขึ้นไหม
คำถามที่ 2
การเก็บฐานข้อมูล เป็น แสน เป็นล้าน เขาใช้วิธีเก็บอย่างไร และใช้วิธีเรียกใช้ข้อมูลอย่างไร
คำถามที่ 3
InnoDB กับ MyISAM ข้อมูล เป็นแสนข้อมูล จะใช้ อันไหนดี
คำถามที่ 4
การกำหนด INDEX เยอะๆ table ละ 2-4 ตัว จะส่งผลเสีย มากไหม
เพียงเท่านี้ก่อนดีกว่าครับ
การ select *
Jessy Thu, 28/05/2009 - 19:28
การ select * มันก็ทำให้ช้าแล้วละครับ แบบที่สามของคุณนั่นละถูกแล้ว เลือกเอามาเฉพาะที่ต้องการ ส่วนตัวอย่างที่ 4 ที่ไวเพราะมันทำงานแค่ Table เดียว
ผมก็ลองเค
iAmbAsE Thu, 28/05/2009 - 20:12
In reply to การ select * by Jessy
ผมก็ลองเคยเลือกแล้วครับ แต่มันมีปัญหาตรงที่ เมื่อ query ข้อมูลที่ เป็น type text มันก็จะช้ามาก ส่วน varchar ปกติครับ
คำถามที่ห
sirn Thu, 28/05/2009 - 20:32
คำถามที่หนึ่ง:
เวลา
UNIONเนี่ย MySQL จะลอกข้อมูลทั้งหมดไปเก็บไว้ใน temporary table ทำให้เวลามี field ใหญ่ๆ อย่างTEXTกับข้อมูลจำนวนมาก เวลาที่ใช้จึงนานขึ้นตามครับข้อแตกต่างระหว่างกรณีที่ 1 กับ 2 นั้นเป็นบั๊กของ optimizer ครับ (
UNION ALLจะสร้าง INDEX ใน temporary table ขณะที่UNIONเฉยๆ จะไม่สร้าง)คำถามที่สอง:
เริ่มจากทำ master-slave เพื่อกระจาย read แล้วก็ต่อด้วย partitioning ครับ LiveJournal Scaling Paper สรุปเรื่องนี้ไว้ดีมาก
คำถามที่สาม:
ในกรณีของผมจะใช้ InnoDB เสมอครับ แล้วอัดขนาด buffer ในคอนฟิคเอา ยกเว้นตาราง log ที่ต้องการ write สูง จะใช้ MyISAM
คำถามที่สี่:
ดูกระทู้เก่า
ตาราง log
Ford AntiTrust Thu, 28/05/2009 - 21:58
In reply to คำถามที่ห by sirn
ตาราง log แนะนำให้ใช้ ARCHIVE Storage Engine เพราะมันจะสามารถทำได้แค่ INSERT และ SELECT และแถมมันช่วยบีบอัดด้วย zlib อีกด้วย ซึ่งช่วยลดปัญหาเรื่องความน่าเชื่อถือได้เยอะครับเพราะมัน DELETE กับ UPDATE ไม่ได้ (แต่มันก็ใช้ ORDER BY ไม่ได้นี่ดิ) เหมาะกับเอามาทำ log table มากๆ เพราะ insert เร็วสุดใน Storage Engine ทั้งหมดแล้วครับ
Ford AntiTrust’s Blog | PHP Hoffman Framework
ถ้าจำไม่ผ
ipats Thu, 28/05/2009 - 23:59
In reply to คำถามที่ห by sirn
ถ้าจำไม่ผิด union all กับ union เฉยๆ มันจะได้ผลไม่เหมือนกันนะครับ คือถ้า union เฉยๆ (มันคือ union distinct) มันจะเอาแถวที่ซ้ำกันออกให้ด้วย ดังนั้นตัวที่สร้าง index จริงๆ แล้วคือ union ครับ เพื่อการเอามาเทียบแถวซ้ำนั่นเอง
ส่วน union all จะเป็นการรวมแบบรวมๆ ไปให้หมด มีไรก็จับมารวมกัน ไม่ได้สนใจว่ามันซ้ำไหม
iPAtS
ขอบคุณสำห
iAmbAsE Fri, 29/05/2009 - 11:57
In reply to คำถามที่ห by sirn
ขอบคุณสำหรับทุกคำตอบครับ
ถ้าใช้ MySQL v.5
แล้ว Create view as select... UNION ALL select ....
เวลาเราเรียกผ่าน view จะทำให้เรียกได้เร็วหรือช้ากว่่าเดิม ครับ
ใน MySQL 5.1
Ford AntiTrust Fri, 29/05/2009 - 12:46
In reply to ขอบคุณสำห by iAmbAsE
ใน MySQL 5.1 เนี่ย view ทำ cache ได้แล้ว แต่ต่ำกว่านั้นหมดสิทธิ์ ใช้ SELECT ปรกติจะเร็วกว่า
Ford AntiTrust’s Blog | PHP Hoffman Framework
จำได้ว่า
wiennat Sat, 30/05/2009 - 09:26
จำได้ว่า architect ของ Flickr ออกมาบรรยายเรื่อง Django ว่าทำไมไม่ใช้ SELECT * เพราะว่ามันเปลืองแบนด์วิธมากๆ (ซึ่งมันก็จริงในบางกรณี)
แต่ Flickr ใช้ PHP นะ
onedd.net