程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 執行計劃中Using filesort,Using temporary相關語句的優化解決

執行計劃中Using filesort,Using temporary相關語句的優化解決

編輯:MySQL綜合教程


昨天聽開發人員提到,相關的彩票網頁當中一個頁面刷新的很慢,特別是在提取數據的時候,
今天早上一到,便去找開發人員要去相關的也沒進行浏覽,窺探哪些數據出現了問題,開發人員
使用PHP開發,所以我用IE很容易就可以窺探到哪些sql執行的很慢,比如下;
  www.2cto.com   這個圖上列出了,也沒中取sql語句的相關執行時間預估比例,以此我可以探查到大概哪些語句會
影響到我們的業務系統!首先看到了有個500,200毫秒的問題,熟話說,槍打出頭鳥,哈哈,優化
也一樣,先把大的問題解決了,在來收拾小的問題(小的問題,也有可能受到大問題的干預造成),
於是我便把該語句找出來;如下; SELECT 
  a.user_name as username, 
  a.order_date as ordertime, 
  a.bonus_value as bonus, 
  cm.name_1 as lname 
FROM 
  lot_sellform AS a 
INNER JOIN 
  code_mst AS cm ON a.lottery_id = cm.cd AND a.lottery_type = cm.lot_type
WHERE 
  a.bonus_value > 0 
ORDER BY 
  a.order_date DESC 
limit 
  10
  www.2cto.com  
基本上改弄的索引信息都弄到了,但是我在頁面中卻看到了這樣的情況;如圖; 看到type類型基本都走了索引,而且extra列內還有using temporary,using filesort,他們用到了
臨時表和在文件內進行了排序,才返回出來,這肯定不是按照我們原先設計的最優路線來走的,
而且相關的索引路線都沒走上,這裡我有查了相關的資料,在官網上,看到如下內容;(我用藍色
來表名相關的信息) 在某些情況中,MySQL可以使用一個索引來滿足ORDER BY子句,而不需要額外的排序。   www.2cto.com   即使ORDER BY不確切匹配索引,只要WHERE子句中的所有未使用的索引部分和所有額外的
ORDER BY 列為常數,就可以使用索引。下面的查詢使用索引來解決ORDER BY部分: SELECT * FROM t1   ORDER BY key_part1,key_part2,... ;   SELECT * FROM t1   WHERE key_part1=constant   ORDER BY key_part2;   SELECT * FROM t1   ORDER BY key_part1 DESC, key_part2 DESC;   SELECT * FROM t1   WHERE key_part1=1   ORDER BY key_part1 DESC, key_part2 DESC; 這幾句話嚴重勾起了我的興趣,愛好!哈,在排序中,去查看沒有進行索引,而且我在日期列上
添加了btree索引了!怎麼會沒走呢?以下是圖信息;
  www.2cto.com   從上圖可以看出,排序仍然是在臨時表,和文件中進行了,而且type還是ALL比較耗時的操作,
這裡我又會想起前面官網中提及到的,key_part1,key_part2這兩列,在where語句中,和order by中
出現的比率這麼頻繁,而且上面說,如果where語句中只要為啥用索引語句列的部分,和所有order by
列的數據如果為常數,可以使用索引路線來走,那如果我對兩者來進行彼此的綁定了,比如;讓其
來做個組合索引!
  www.2cto.com  
首先where條件中bonus_value的值,我們取得是常數,而且在進行排序的時候,我們選擇的是
order_date日期的列值,如果彼此來進行綁定組合,sql在選擇路線的窺探中首先會嘗試,組合索
引中位於第一列的數列,進行handle的鎖定,遍歷到數值後會繼續留住該handle的位於LRU列表
頭中,接著繼續進行數值的排序遍歷結果集合,直到handle列被擠出index維護的元頭之外!

其實這個不是讓其走我們的bonus_value,order_date索引路徑,而且讓其走到我們前面INNER JOIN
中的索引路線,避免了讓數據在臨時表中出現,或者在磁盤文件中排序,其實就是增大了,我們在鏈接
條件中我們設計索引路線的概率問題!有點聲東擊西的概念!哈!以下圖供參考:
  以此看到走了我們需要的索引路徑了!
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved