ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => ข้อความที่เริ่มโดย: Lunifer ที่ 02 ตุลาคม 2012, 12:29:25



หัวข้อ: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: Lunifer ที่ 02 ตุลาคม 2012, 12:29:25
สมมติว่า ผมมี 4 ตาราง 1.tv 2.radio 3.laptop 4.tablet
select * from ตาราง order by RAND() limit จำนวนที่อยากได้

มันมีวิธีที่ผมจะเขียน random ที่เดียว 4 ตาราง เลยมัยครับโดยใช้โค้ด sql แค่บรรทัดเดียว


หัวข้อ: Re: สบอถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: aekarach ที่ 02 ตุลาคม 2012, 12:38:09
เขียนแบบหลายบรรทัดแต่ Statement เดียว

โค๊ด:
select * from (
  select * from tv
 
  union all
 
  select * from radio
 
  union all
 
  select * from laptop
 
  union all
 
  select * from tablet
) Order by RAND();

อันนี้เขียนแบบบรรทัดเดียวแต่ Statement เดียว

โค๊ด:
select * from (select * from tv union all select * from radio union all select * from laptop union all select * from tablet) Order by RAND();

ปล.ไม่แน่ใจ Syntax ถูกต้องหรือเปล่า แต่ที่แน่ๆ ออกแบบ Database แบบนี้ถือว่าไม่ผ่าน


หัวข้อ: Re: สบอถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: Lunifer ที่ 02 ตุลาคม 2012, 12:41:30
ขอบคุณครับเดี๋ยวเอาไปลองดูก่อน เพราะมันเป็นก้อนเดียวกัน สินค้าเป็นหมื่น เวลาดึงจากโฮส เปิดเว็บช้ามากเกิน 6 วิ ผมเลยลองแยกดูว่าจะ คิวรี่หน้าเว็บเร็วขึ้นมัย
1 ตารางรวมทุกอย่างหลายหมื่น
กับหลายตารางแยกเก็บ table เป็นชนิดสินค้า

ที่บอกว่าไม่ผ่านรบกวนแนะนำด้วยครับมีวิธีไหนดีกว่านี้มัยครับ  :wanwan017:


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: aekarach ที่ 02 ตุลาคม 2012, 12:47:40
ระหว่าง Table Master Product กับ Table Transaction Production ควรแยกจากกัน

ใน Transaction refer กับ Master ด้วย Primary Key เช่น ProductID ก็เพียงพอแล้ว เพื่อประหยัดเนื้อที่และความเร็วในการ Query
และถูกต้องตามหลัก Database Normalization


ต่อให้เซิร์ฟเวอร์แพงแค่ไหน แต่ถ้าออกแบบไว้ไม่ดี เซิร์ฟเวอร์ก็ทำงานได้ไม่ดีเช่นกัน

อยากเห็นคนไทยออกแบบดาต้าเบสเก่งๆ เอาใจช่วยครับ


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: Lunifer ที่ 02 ตุลาคม 2012, 12:54:36
Normalization
เป็นสคิปที่ต้องดึงข้อมูลพวก รูปภาพ/ราคา/รายละเอียด/ดาว มาแสดง
ถ้าผม แยกอีก ตามหลักที่เรียนมาช่วง มหาลัย มันจะทำให้เร้วขึ้นหรอครับ
เพราะถ้า มาถึง แรนดอมไป ก็ดึง ID ไปก่อน เพื่อที่จะมาดึง ข้อมูลที่แยกไว้อีกตาราง
เร็วขึ้นเยอะมัยครับ เพราะลองแล้วไม่ได้ผล ความช้ายังเท่าเดิม กลายเป้น ดึงดาต้า 2 ครั้งอีก


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: mikeyx ที่ 02 ตุลาคม 2012, 13:00:51
Normalization ถ้าข้อมูลไม่เยอะไม่เกินหลักแสน record ก็เร็วดีครับเวลาเรียกใช้ข้อมูลแต่ถ้าเยอะกว่านั้นต้องมานั่งแก้กันใหม่ให้เร็วยิ่งขึ้นด้วยการแคชที่ดาต้าเบสกับ file อีกรอบ


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: Lunifer ที่ 02 ตุลาคม 2012, 13:02:59
ผมเขียนสคริปทำอเมซอนครับ คิดว่าเกิน 100000 สินค้าแน่ๆ ขอบคุณครับ +1 ทั้ง 2 ท่านปล่อยตกเลยครับ


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: icez ที่ 02 ตุลาคม 2012, 13:06:25
ไอ้ random นี่แหละครับตัวทำให้ช้า ไม่ว่าจะแยกหรือไม่แยก เพราะมันต้อง scan ทั้งตาราง แล้วเรียงลำดับใหม่ (แบบสุ่ม)

ยิ่งถ้าเอามารวมกันอีกนี่ยิ่งหนักครับ ...


ถ้าเป็นไปได้ เลิกใช้เถอะครับ


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: aekarach ที่ 02 ตุลาคม 2012, 13:19:39
ผมเขียนสคริปทำอเมซอนครับ คิดว่าเกิน 100000 สินค้าแน่ๆ ขอบคุณครับ +1 ทั้ง 2 ท่านปล่อยตกเลยครับ

แล้วแต่เทคนิคนะครับ ตรงนี้มันเป็นเรื่องเทคในการเขียนโปรแกรม สิ่งสำคัญในการพัฒนาโปรแกรม ลองดูว่าเครื่องมือที่เราใช้นั้นสามารถทำอะไรได้บ้าง เราก็นำ Feature ตรงนี้แหละครับไปช่วยในการพัฒนา


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: goweb ที่ 02 ตุลาคม 2012, 14:30:16
ไอ้ random นี่แหละครับตัวทำให้ช้า ไม่ว่าจะแยกหรือไม่แยก เพราะมันต้อง scan ทั้งตาราง แล้วเรียงลำดับใหม่ (แบบสุ่ม)

ยิ่งถ้าเอามารวมกันอีกนี่ยิ่งหนักครับ ...


ถ้าเป็นไปได้ เลิกใช้เถอะครับ
เห็นด้วยเป็นอย่างยิ่ง ^ ^


หัวข้อ: Re: สอบถามเรื่อง Sql ครับ
เริ่มหัวข้อโดย: tctheworld ที่ 02 ตุลาคม 2012, 21:04:24
หลายๆท่านก็ตอบไปแล้ว

ส่วนผมขอแนะนำการเิ่พิ่มความเร็วนะครับ

1.set index ในฐานข้อมูลที่เป็น unique
2.ให้ทำการ random ตัวเลขขึ้นมาชุดนึง แล้วค่อยมาทำ query โดยใช้ where id IN ($ran2, $ran3, $ran4, $ran5, $ran6, $ran7)
เพราะการใช้ order RAND() กับข้อมูลจำนวนมากจะมีผลทำให้ช้า

เลยตัดมาใช้แบบนี้รับรองเร็วขึ้นแน่ครับ