前面也有一些優化的策略,現在在看看一些優化關於group by 語句、 order by語句 等。
[b] 優化group by語句[/b]
預設情況下,mysql對所有group by col1,col2...的字段進行排序。這與在查詢中指定order by col1,col2...類似。因此,如果顯式包括乙個包含相同的列的order by子句,則對mysql的實際執行效能沒有什麼影響。 如果查詢包括group by 但使用者想要避免排序結果的消耗,則可以指定order by null禁止排序,例如:
[quote]
explain select id, sum(moneys) from sales2 group by id \g
explain select id, sum(moneys) from sales2 group by id order by null \g
[/quote]
你可以通過比較發現第一條語句會比第二句在extra:裡面多了using filesort.而恰恰filesort是最耗時的。
[b] 優化order by語句[/b]
在某些情況中,mysql可以使用乙個索引來滿足order by子句,而不需要額外的排序。where 條件和 order by使用相同的索引,並且order by的順序和索引順序相同,並且order by的字段都是公升序或者都是降序。
例如:[quote]
select * from t1 order by key_part1,key_part2,....:
select * from t1 where key_part1 = 1 order by key_part1 desc,key_part2 desc;
select * from t1 order by key_part1 desc, key_part2 desc;
[/quote]
但是以下的情況不使用索引:
[quote]
select * from t1 order by key_part1 desc, key_part2 asc;
--order by的字段混合asc 和 desc
select * from t1 where key2=constant order by key1;
----用於查詢行的關鍵字與order by 中所使用的不相同
select * from t1 order by key1, key2;
----對不同的關鍵字使用order by
[/quote]
[b]優化巢狀查詢[/b]
mysql4.1開始支援sql的子查詢。這個技術可以使用select語句來建立乙個單列的查詢結果,然後把這個查詢結果作為過濾條件用在另乙個查詢中,使用子查詢可以一次性地完成多邏輯上需要多個步驟才能完成的sql操作,同時也可以避免事務或者表鎖死,並且些起來也很容易。但是,有些情況下,子查詢可以被更有效的連線(join)替代。
例如:[quote]
explain select * from sales2 where company_id not in(select id from company2) \g
explain select * from sales2 left join comany2 on sales2.company_id = company2.id where sales2.company_id is null \g;
[/quote]
第一句看起來比第二句更簡潔,但是第二句比第一就更快。因為使用join來完成這個查詢,速度比較快,尤其如果對compay2表中的id建立了索引的話,那麼效能將會更好。那為什麼在這種情況下使用join會更有效率呢。[color=red]因為mysql不需要在記憶體中建立臨時表來完成這個邏輯上需要兩個步驟的查詢工作。[/color]
[b]優化or條件[/b]
對於含有or的查詢子句,如果要利用索引,則or之間的每個條件列都必須用到索引;如果沒有索引,則考慮增加索引。
[b] 使用sql提示[/b]
sql 提示(sql hint)是優化資料庫的乙個重要手段,簡單來說就是在sql語句中加入一些人為的提示來達到優化的操作的目的。
例如:[quote]
select sql_buffer_results * from ...
[/quote]
這個語句將強制mysql生成乙個臨時結果集。只要臨時結果集生成後,所有表上的鎖定均被釋放。這能在遇到表鎖定問題時或者要花很長時間將結果傳給客戶端時所幫助,因為可以盡快釋放鎖資源,
下面是一些在mysql中常用的sql提示。
[quote]
1. use index
在查詢語句中表名的後面,新增use index 來提供希望mysql去參考的索引列表,就可以讓mysql不再考慮其他可用的索引。
[quote]
explain select * from sales2 use index (ind_sales2_id) where id 3 \g;
[/quote]
2. ignore index
如果使用者只是單純地想讓mysql忽略乙個或者多個索引,則可以使用ignore index 作為hint
3. force index
為強制mysql使用乙個特定的索引,可在查詢中使用force index作為hint。例如當不強制使用索引的時候,因為id的值都是大於0的,因為mysql會預設進行全表掃瞄,而不使用索引。例如:
[quote]
expalin select * from sales2 where id > 0 \g;
[/quote]
但是,當使用force index進行提示時,即便使用索引的效率不是很高,mysql還是選擇使用了索引,這是mysql留給使用者的乙個自行選擇執行計畫的權利。加入force index提示後在執行上面的sql
[quote]
explain select * from sales2 force index(index_sales2_id) where id > 0 \g;
[/quote]
[/quote]
sql優化問題是資料庫效能優化最基礎也是最重要的乙個問題,實踐表明很多資料庫效能問題都是由於不合適的sql語句造成。一些列的sql優化描述。怎麼定位問題,怎麼在編寫的時候優化,怎麼來應對。不過優化sql語句經常需要考慮的幾個方面,比如索引,表分析,排序等等。
資料庫優化之MySQL優化 二 索引優化
索引優化 分類 普通索引,唯一索引,主鍵索引,聯合索引 問題 如何選擇合適的列建立索引?1 在where從句,group by從句,order by從句,on從句中出現的列 2 索引字段越小越好 3 離散度大的列放到聯合索引的前面 select from payment where staff id...
資料庫效能優化二 資料庫表優化
資料庫優化包含以下三部分,資料庫自身的優化,資料庫表優化,程式操作優化.此文為第二部分優化 設計規範化表,消除資料冗餘 資料庫正規化是確保資料庫結構合理,滿足各種查詢需要 避免資料庫操作異常的資料庫設計方式。滿足正規化要求的表,稱為規範化表,正規化產生於20世紀 70年代初,一般表設計滿足前三正規化...
資料庫效能優化二 資料庫表優化
優化 設計規範化表,消除資料冗餘 資料庫正規化是確保資料庫結構合理,滿足各種查詢需要 避免資料庫操作異常的資料庫設計方式。滿足正規化要求的表,稱為規範化表,正規化產生於20世紀 70年代初,一般表設計滿足前三正規化就可以,在這裡簡單介紹一下前三正規化 第一正規化 1nf 無重複的列 所謂第一正規化 ...