1. 程式人生 > >高效能mysql(二)schema設計以及sql執行、優化

高效能mysql(二)schema設計以及sql執行、優化

1.索引覆蓋:因為使用B+TREE儲存索引資料(索引也是資料庫的資料),因為葉子節點上儲存著資料,其他索引也是通過主鍵去查詢資料,如果可以直接把索引的資料讀出使用而不用再次進入資料庫表中進行查詢操作,可以極大地提高效率(當然被查詢的資料也必須在索引這個資料結構中)。注:索引資料是索引的索引集合(包括主鍵以及其他普通索引)。

2.explain:

         using index:表示資料不需要回表查詢,查詢所需的資料都是從索引檔案(資料)中獲取,

         using where:需要回表進行資料查詢

3.優化注意點:

         3.1 : EXPLAIN SELECT COUNT(*) FROM t2_cdn_log 
where type=1 and object_Id in (51,52,54,59,61,69,70,71,97,98,103,104,105,106) 
and UNIX_TIMESTAMP('2018-12-05 00:00:00')<=UNIX_TIMESTAMP(log_time) 
and UNIX_TIMESTAMP(log_time)<=UNIX_TIMESTAMP('2018-12-05 23:59:59') #group by time;

         3.2 : EXPLAIN select sum(response_size),(UNIX_TIMESTAMP(log_time)-UNIX_TIMESTAMP('2018-12-05 00:00:00')) div 300 as time 
from t2_cdn_log where '2018-12-05 00:00:00'<=log_time
and log_time<='2018-12-05 23:59:59'
and type=1 and object_Id in (51,52,54,59,61,69,70,71,97,98,103,104,105,106) group by time

    兩條語句都顯示走了索引,但是第一條顯示rows為七百多萬,但是第二條只有14條:原因就是使用了 UNIX_TIMESTAMP()時間轉換函式而導致索引失效,儘管顯示其使用了index但是因為這種原因而導致索引無效

4.查詢執行的基礎:

5.union 查詢:

   對於union查詢,mysql現將一系列的單個查詢結果放到一個臨時表中,然後再重新讀出臨時表資料來完成union查詢,在mysql中,每個查詢都是一次關聯,所以讀取結果臨時表也是一次關聯。

6.mysql 執行關聯查詢:

   當前mysql關聯執行的策略很簡單,對任何關聯都執行巢狀迴圈關聯操作,即mysql先在一個表中迴圈取出單條資料,然後再巢狀迴圈到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止。然後根據各個表匹配的行,返回查詢中需要的各個列。mysql會嘗試在最後一個關聯表中找到所有匹配的行,如果最後一個關聯表無法找到更多的行以後,mysql返回到上一層次關聯表,看是否能夠找到更多的匹配記錄

       join關聯:

       left join :

關聯查詢: