天天看點

mysql優化學習

mysql手冊sql優化學習:

BENCHMARK(1000000,1+1)

的了解:

執行右邊表達式(1+1)1000000次。

該函數執行所傳回的結果永遠是0

英文參考了解:表達式必須是标量表達式。比如select 傳回的是很多行,是一個結果集。那麼執行該函數的時候并沒有任何結果顯示。失敗了。傳回的結果必須是單列或者是單行。

一、使用explain工具顯示資訊:

explain語句結果資訊的使用:

id     select_type table     type     possible_keys     key     key_len     ref     rows     Extra

1     SIMPLE        fanwe_goods     index     NULL          PRIMARY     4      

      NULL     267     Using index

一一解釋如下:

key項目的值,就表示使用到了那個索引。上面。使用到了名為primary的索引,就是主鍵索引。

rows:rows列顯示MySQL認為它執行查詢時必須檢查的行數。那麼我可以了解:這個值的數越小越好。表示需要掃描的行數越少。

      從EXPLAIN輸出的rows列是一個來自MySQL聯接優化器的“教育猜測”。你應該檢查數字是否接近事實。

      盡管我嘗試使用了limit進行限制。但是explain檢視這個結果還是267。說明:還是進行了267行檢查。我以為不會檢查這麼多行數了。

type 表示聯接的類型。值是index,表示用到了索引。all表示進行了全盤掃描。通過這個項目的值能夠看出你的sql在執行了什麼操作,可以評價性能如何

       type列内的index_merge該聯接類型表示使用了索引合并優化方法

select_type 表示查詢的類型。上面值是simple,表示隻是簡單的查詢,沒有用到聯合查詢。

Extra:Using where MySQL解決查詢的詳細資訊

總的來說,要想使一個較慢速SELECT ... WHERE更快,應首先檢查是否能增加一個索引

從explain可以看出mysql查詢使用索引的規則:mysql查詢每次隻能使用一個索引

tt.AssignedPC = et_1.EMPLOYID 這兩個表中的字段類型要保持一樣。這樣可以減少搜尋的行數。通過explain看,rows項目中就是少了一個乘積。這樣做所依據的原理是:

MySQL能更高效地在聲明具有相同類型和尺寸的列上使用索引。也就是類型相同,尺寸相同比如都是char類型。長度都是10。這樣,聯合查詢的時候就是使用索引。

注:在mysql查詢優化中。VARCHAR和CHAR看成是相同的類型。接下來隻要保證其長度相同就行了。

通過相乘EXPLAIN輸出的rows列的所有值,你能得到一個關于一個聯接如何的提示。這應該粗略地告訴你MySQL必須檢查多少行以執行查詢。

了解:如果是多個表join查詢。可以檢視每行顯示的rows值,将他們乘積,這樣就大概判斷出你這個查詢檢查了多少行。

二、怎麼優化where子句。

去除不必要的括号:

1.

                        ((a AND b) AND c OR (((a AND b) AND (c AND d))))

               -> (a AND b AND c) OR (a AND b AND c AND d)

實際測驗:

0.0024 秒 都一樣。沒有太大差別。

體會:減少括号原理上的知識是,減少mysql查詢優化器的解析括号的工作量。這與select使用索引的技巧是不同層面上的東西。

可以這樣分類sql的優化工作:一是去除導緻增加查詢負擔不必要的文法。二是,優化表,使之更加适合高效sql

索引合并方法的了解:

将多個結果并成一個。取交集或者取并集。這是mysql優化器算法上的東西。有好幾種算法。索引合并交集通路算法。一種語句的不同,已經告訴了mysql查詢優化器決定使用了何種查詢算法。

。比如表現語句:

WHERE key_part1 = 10 OR key_part2 = 20;  将兩個結果取并集

下面語句,一個是使用索引優化方式。一個是使用範圍掃描方式。

1.(goodkey1 < 10 OR goodkey2 < 20)

2.badkey < 30

三、

DELETE語句的速度:

如果想要删除一個表的所有行,使用TRUNCATE TABLE tbl_name 而不要用DELETE FROM tbl_name

left join看着手冊,可能翻譯不那麼準确。沒有明确提到怎麼做。猜出大概方向是将内連接配接盡量轉化為普通連接配接的形式。這樣就提高查詢效率。

手冊上提到:MySQL可以進行下面的LEFT JOIN優化:如果對于産生的NULL行,WHERE條件總為假,LEFT JOIN變為普通聯接。

通過看上面提到的一個轉換執行個體,将left join 類型的連接配接轉化成了自連接配接形式(也就是去掉join形式,隻有where)。

從這裡是不是可以猜測,轉化原則是下面的:

聯合查詢能夠不用的,盡量不用。有些是可以使用where子句的形式得到同樣的關聯表的效果的。還記得,之前的選題系統查詢都關聯了3-5個表。沒有使用join的形式,也達到的查詢目标。

下面是将join查詢轉化為普通的where查詢的實踐報告:

1.使用left join:SELECT o.memo, o.create_time, u.user_name

FROM fanwe_order o, fanwe_user u, fanwe_order_goods g

WHERE o.user_id = u.id

AND o.id = g.order_id

AND g.rec_id =352

LIMIT 0 , 10

查詢花費 0.0005 秒)

2.使用where的方式:

SELECT o.memo, o.create_time, u.user_name

查詢花費 0.0006 秒

結論:where的方式查詢時間多了。這是小量資料查詢。如果很大量的話,差異就會更大了。如果沒弄清楚,都将join查詢方式改為where去實作。效果變慢都不知道原因了。在沒有把握确定之前,最好是自己測試兩種方式,哪種的執行速度更快。

細節:join查詢的方式,使用explain顯示查詢過程。顯示的查詢類型也是simple。

主要還是要了解left join的工作内部機制。這樣就知道怎麼去優化

調換兩個表之間的順序目的是減少對表的全盤掃描。帶着這個目标去優化。它所依據的原理在手冊上這樣提到了:LEFT JOIN和STRAIGHT_JOIN強制的表讀順序可以幫助聯接優化器更快地工作,因為檢查的表交換更少

使用right join的比較少。甯願将左右連接配接的兩個表之間換個順序,這樣使用 left join方式進行代替。

根據手冊上的示範進行了解如下sql:

a,b left join c 與 b,a left join c。顯示的結果一樣。但是效率不一樣。手冊上的大概意思是,第一種sql會在讀取c表之前對b表進行全盤掃描。那麼,第二種sql是不是使a表在c表之前掃描了呢?

從這裡推測出一個規則:調換b的順序就意味着,強制地改變了表的讀取(掃描)順序。