1
การจัดการ Mysql - MariaDB / SQL Query Tuning การเขียน SQL ให้ทำงานได้เร็วขึ้น
« เมื่อ: สิงหาคม 06, 2014, 01:35:24 pm »
พื้นฐาน การสร้าง statement sql ที่ทำให้การกระทำนั้นๆเร็วขึ้น
1.การ ค้นหาจะเร็วขึ้น ถ้าเลือกบาง filed มาแสดงแทนการใช้ *
ควรใช้
SELECT id, first_name, last_name, age, subject FROM student_details;
แทนการใช้
SELECT * FROM student_details;
2.ไม่ควรใช้คำสั่ง HAVING ที่ผิดวัตถุประสงค์ของคำสั่ง แม้จะได้ผลลัพธ์ที่เหมือนกัน เช่น
แบบที่ถูกต้อง
SELECT subject, count(subject)
FROM student_details
WHERE subject != 'Science'
AND subject != 'Maths'
GROUP BY subject;
แบบที่ไม่ถูกต้อง
SELECT subject, count(subject)
FROM student_details
GROUP BY subject
HAVING subject!= 'Vancouver' AND subject!= 'Toronto';
3.ถ้าไม่จำเป็นอย่าใช้ query ย่อย ใน query หลัก
เขียนแบบนี้
SELECT name
FROM employee
WHERE (salary, age ) = (SELECT MAX (salary), MAX (age)
FROM employee_details)
AND dept = 'Electronics';
แทนแบบนี้
SELECT name
FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee_details)
AND age = (SELECT MAX(age) FROM employee_details)
AND emp_dept = 'Electronics';
4.การใช้ EXISTS, IN เพื่อการ join ตาราง
a.จะทำให้ประสิทธิภาพช้าลง
b.IN จะใช้ได้ดีกับแบบสอบถามย่อย
c.EXISTS มีประสิทธิภาพที่สุดในการใช้ในแบบสอบถามหลัก
ควรใช้
Select * from product p
where EXISTS (select * from order_items o
where o.product_id = p.product_id)
แทนการใช้
Select * from product p
where product_id IN
(select product_id from order_items)
5.ใช้ EXISTS แทน DISTINCT เมื่อใช้กับตารางที่มีความสัมพันธ์แบบ one-to-many
ควรใช้
SELECT d.dept_id, d.dept
FROM dept d
WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e.dept = d.dept);
แทน
SELECT DISTINCT d.dept_id, d.dept
FROM dept d,employee e
WHERE e.dept = e.dept;
6. ใช้คำสั่ง UNION ALLแทน UNION.
ควรใช้
SELECT id, first_name
FROM student_details_class10
UNION ALL
SELECT id, first_name
FROM sports_team;
แทนการใช้
SELECT id, first_name, subject
FROM student_details_class10
UNION
SELECT id, first_name
FROM sports_team;
7.ควรระวังในการใช้คำสั่ง WHERE
ควรใช้
SELECT id, first_name, age FROM student_details WHERE age > 10;
แทนการใช้
SELECT id, first_name, age FROM student_details WHERE age != 10;
ควรใช้
SELECT product_id, product_name
FROM product
WHERE unit_price BETWEEN MAX(unit_price)
and MIN(unit_price)
แทนการใช้
SELECT product_id, product_name
FROM product
WHERE unit_price >= MAX(unit_price)
and unit_price <= MIN(unit_price)
ควรใช้
SELECT id, first_name, age
FROM student_details
WHERE age > 10;
แทนการใช้
SELECT id, first_name, age
FROM student_details
WHERE age NOT= 10;
8.ให้เก็บ binary file ไว้ในระบบ file แล้วเก็บ path ไว้ในฐานข้อมูลแทนการเก็บข้อมูล แบบ binary เพราะจะทำให้ฐานข้อมูลมีขนาดใหญ่
9.ให้เขียนตามกฎที่ถูกต้องตามมาตรฐานของ ภาษา sql
a.ตัวพิมพ์ ใหญ่-เล็ก ตามกฎ
b.เริ่มการกระทำในบรรทัดใหม่
c.แยกคำด้วยช่องว่างเพียงเคาะเดียว
ขอบคุณข้อมูลจาก
http://beginner-sql-tutorial.com
http://beginner-sql-tutorial.com/sql-query-tuning.htm
1.การ ค้นหาจะเร็วขึ้น ถ้าเลือกบาง filed มาแสดงแทนการใช้ *
ควรใช้
SELECT id, first_name, last_name, age, subject FROM student_details;
แทนการใช้
SELECT * FROM student_details;
2.ไม่ควรใช้คำสั่ง HAVING ที่ผิดวัตถุประสงค์ของคำสั่ง แม้จะได้ผลลัพธ์ที่เหมือนกัน เช่น
แบบที่ถูกต้อง
SELECT subject, count(subject)
FROM student_details
WHERE subject != 'Science'
AND subject != 'Maths'
GROUP BY subject;
แบบที่ไม่ถูกต้อง
SELECT subject, count(subject)
FROM student_details
GROUP BY subject
HAVING subject!= 'Vancouver' AND subject!= 'Toronto';
3.ถ้าไม่จำเป็นอย่าใช้ query ย่อย ใน query หลัก
เขียนแบบนี้
SELECT name
FROM employee
WHERE (salary, age ) = (SELECT MAX (salary), MAX (age)
FROM employee_details)
AND dept = 'Electronics';
แทนแบบนี้
SELECT name
FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee_details)
AND age = (SELECT MAX(age) FROM employee_details)
AND emp_dept = 'Electronics';
4.การใช้ EXISTS, IN เพื่อการ join ตาราง
a.จะทำให้ประสิทธิภาพช้าลง
b.IN จะใช้ได้ดีกับแบบสอบถามย่อย
c.EXISTS มีประสิทธิภาพที่สุดในการใช้ในแบบสอบถามหลัก
ควรใช้
Select * from product p
where EXISTS (select * from order_items o
where o.product_id = p.product_id)
แทนการใช้
Select * from product p
where product_id IN
(select product_id from order_items)
5.ใช้ EXISTS แทน DISTINCT เมื่อใช้กับตารางที่มีความสัมพันธ์แบบ one-to-many
ควรใช้
SELECT d.dept_id, d.dept
FROM dept d
WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e.dept = d.dept);
แทน
SELECT DISTINCT d.dept_id, d.dept
FROM dept d,employee e
WHERE e.dept = e.dept;
6. ใช้คำสั่ง UNION ALLแทน UNION.
ควรใช้
SELECT id, first_name
FROM student_details_class10
UNION ALL
SELECT id, first_name
FROM sports_team;
แทนการใช้
SELECT id, first_name, subject
FROM student_details_class10
UNION
SELECT id, first_name
FROM sports_team;
7.ควรระวังในการใช้คำสั่ง WHERE
ควรใช้
SELECT id, first_name, age FROM student_details WHERE age > 10;
แทนการใช้
SELECT id, first_name, age FROM student_details WHERE age != 10;
ควรใช้
SELECT product_id, product_name
FROM product
WHERE unit_price BETWEEN MAX(unit_price)
and MIN(unit_price)
แทนการใช้
SELECT product_id, product_name
FROM product
WHERE unit_price >= MAX(unit_price)
and unit_price <= MIN(unit_price)
ควรใช้
SELECT id, first_name, age
FROM student_details
WHERE age > 10;
แทนการใช้
SELECT id, first_name, age
FROM student_details
WHERE age NOT= 10;
8.ให้เก็บ binary file ไว้ในระบบ file แล้วเก็บ path ไว้ในฐานข้อมูลแทนการเก็บข้อมูล แบบ binary เพราะจะทำให้ฐานข้อมูลมีขนาดใหญ่
9.ให้เขียนตามกฎที่ถูกต้องตามมาตรฐานของ ภาษา sql
a.ตัวพิมพ์ ใหญ่-เล็ก ตามกฎ
b.เริ่มการกระทำในบรรทัดใหม่
c.แยกคำด้วยช่องว่างเพียงเคาะเดียว
ขอบคุณข้อมูลจาก
http://beginner-sql-tutorial.com
http://beginner-sql-tutorial.com/sql-query-tuning.htm