資料庫調優教程(十二) 最佳化sql語句,調優sql

來源:互聯網
上載者:User

資料庫調優教程(十二) 最佳化sql語句,調優sql
五、           最佳化Sql語句


上一章講了如何設計一張好的表,一張好的表自然需要好的sql語句去操作它。本章就來聊聊如何最佳化sql語句。


1.      Sql語句最佳化原則

最佳化需要最佳化的Query

定位最佳化對象效能瓶頸

從Explain入手

儘可能在索引中完成排序

只取自己需要的Column

儘可能避免複雜的join和子查詢

 

2.     最佳化limit

select * from test1 order by id limit 99999,10

原語句雖然使用了id索引,但是相當於從第一行定位到99999行再去掃描後10行,相當於掃描全表

如果改為
select * from test1 where id>=100000 order by id limit 10

則直接定位到100000尋找


3.     盡量避免SELECT *命令


4.      不讓排序

在使用group by 分組查詢時,預設分組後,還會排序,可能會降低速度.

 

比如: 


在group by後面增加 order by null 就可以防止排序.


5.     使用串連來替代子查詢

有些情況下,可以使用串連來替代子查詢。因為使用join,MySQL不需要在記憶體中建立暫存資料表。

[糟糕的效率]

select * from sales2 where company_id not in(select id from company2)

[簡單處理方式]

select * from dept, emp where dept.deptno=emp.deptno; 

[左外串連,效率最高]


select * from dept left join emp on dept.deptno=emp.deptno;  

6.     利用LIMIT 1取得唯一行

有時,當你要查詢一張表是,你知道自己只需要看一行。在這種情況下,增加一個LIMIT 1會令你的查詢更加有效。這樣資料庫引擎發現只有1後將停止掃描,而不是去掃描整個表或索引

 

7.     使用 EXISTS代替in

 EXISTS要遠比IN的效率高。裡面關係到full table scan和range scan。幾乎將所有的IN操作符子查詢改寫為使用EXISTS的子查詢

 

8.     不要手賤

沒有必要時不要用DISTINCT和ORDER BY

這些動作可以改在用戶端執行,它們增加了額外的開銷



本章結束,下一章聊聊mysql資料庫的其他最佳化方法。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.