標籤: USB CONNECTOR

  • canvas繪製工作流之繪製節點

    canvas繪製工作流之繪製節點

       上一篇我們介紹了canvas繪製工作流的大概步驟,接下來會有系列文章細緻的介紹怎麼用canvas繪製工作流;這篇文章主要介紹用canvas繪製流程節點。

      繪製前我們需要先準備一張節點圖片,例如:;好了,正題開始:

    1. html中添加canvas標籤:
    <canvas id="canvasId" width = "800" height="600" style="border:1px solid black;  margin-left: 1px;"></canvas>

    這裏要注意設置canvas標籤的寬度跟高度,也就是要設置畫布的寬度跟高度。

    1. 獲取畫布對象並初始化畫布參數
    var _canvas= document.getElementById(“canvasId”);
    
    var _height = _canvas.height;//獲取畫布高度
    
    var _width = _canvas.width;//獲取畫布寬度
    
    Var ctx =_canvas.getContext('2d');
    
    //畫個畫布大小的長方形,目的是為了有個好看的小邊框框
    ctx.clearRect(0, 0, _width, _height);
    
    /*繪製畫布的背景線*/
    //設置線寬
    ctx.lineWidth  = 0.1;
    //繪製縱向背景線
    for(var i = 1; i < _width / 15; i++) {
      ctx.beginPath();
      ctx.moveTo(i * 15, 0);
      ctx.lineTo(i * 15, _height);
      ctx.stroke();
    }
    //繪製橫向背景線
    for(var i = 1; i < _ height / 15; i++) {
      ctx.beginPath();
      ctx.moveTo(0, i * 15);
      ctx.lineTo(_width, i * 15);
      ctx.stroke();
    }

     

    繪製完效果如圖:

    1. 獲取節點圖片對象
       //創建新的圖片對象
      
       var _img = new Image();
      
        //指定圖片的URL
      
       _img.src="node.png";

                我這裏為了舉個例子直接創建圖片對象,實際繪製過程中可以直接獲取圖片對象,因為動態創建圖片對象是有個圖片加載的時間。

    1. 繪製節點圖片
    ctx.drawImage(_img,_x,_y,_imgWidth, _imgHeight);

        這裏_img是上面獲取到的圖片對象,_x是圖片要繪製在畫布中的x坐標,_y是圖片要繪製在畫布中的_y坐標,_imgWidth是要將圖片繪製的寬度,_imgHeight是要將 圖片繪製的寬度。

        實際應用過程中,一般都會當去鼠標的位置當做x坐標跟y坐標,具體的後面文章會介紹到。

           繪製的效果圖:

       節點下面的文字後面文章會詳細講到怎麼繪製。

      每天get一點點,每天成長一點點,好了,今天就到這裏。

            

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 敲開通往架構師的門

    最近學習了一些關於架構設計的知識想分享給大家。俗話說得好,不想當架構師的程序員不是好廚子。那麼如何成為一名架構師呢?接下來就聊一聊我的一些想法。

    什麼是架構師

    之前有同學問我,做了幾年技術,應該轉管理還是轉架構師?對於這位同學,我給他的答案是,你要先踏踏實實做好現在的工作。因為就他提的問題來看,應該是剛入行不久或者是在校學生。

    專心做技術的,都想做架構師。但架構師並不是說技術做時間長了可以轉的。隨着你的知識深度和廣度的增加,在工作中會扮演更重要的角色,承擔更大的責任,最終自然而然就會接觸到架構設計的工作。

    而架構師的主要工作,其實是利用架構設計知識以及豐富的工作經驗,在設計架構時,結合實際情況,在不同的選項中做出取捨。

    架構設計的真正目的?

    為什麼要進行架構設計?因為架構設計很重要?可是為什麼重要呢?似乎說不清楚。

    因為可以提升開發效率嗎?也不一定,因為只有簡單的設計才會使開發效率更高。而架構設計出於多方面考慮,不得已會引入一些複雜度,因此架構設計並不一定能提升開發效率。

    是為了大多數口中的“高可用”、“高性能”、“可擴展”嗎?其實也不是。我們的系統可能並不一定需要這些。

    那架構設計的真正目的是什麼呢?我認為架構設計的真正目的是與系統複雜度做鬥爭。

    系統複雜度的來源有:高性能、高可用、可擴展性、低成本、安全、規模

    前面我們聊到有些系統可能不需要高可用、高性能。有些同學可能不理解,這些難道不是軟件開發最基本的要求嗎?這樣的說法是存在一定偏差的。我們舉一個簡單的例子說明一下。

    如果讓你為一所學校設計一個學生信息管理系統。針對上述幾個複雜度的來源,你會做出怎樣的取捨?我們來逐條分析一下。

    首先是高性能,學校的學生最多也就幾萬人,而且平時也不可能幾萬人同時用系統。因此我們並不需要考慮高性能。數據的CRUD直接用關係型數據庫就足夠了。

    然後是高可用,對於學生系統而言,即使宕機幾個小時,影響也不會太大。不過數據的可靠性還是要保證的,如果大量數據丟失而又沒有備份的話,數據修復將會是一項繁重的工作。所以這裏需要做一些數據高可靠的設計。

    接下來是可擴展性,學生管理系統一般比較穩定,不會出現需要擴展的情況。因此我們也不太需要考慮可擴展性。

    至此,我們在設計系統時習慣考慮的高可用、高性能和可擴展,在這個系統中都不需要過多關注了。我們再來看看剩下的幾個複雜度來源。

    關於低成本,由於我們並不需要高可用和高性能的設計,所以幾台服務器的成本對於學校來說也不足為慮。

    安全性而言,學生信息需要一定的安全保證,但也不必做到金融級安全。所以只需要做好數據庫權限管理,登錄密碼管理就足夠了。

    最後是系統規模,學生管理系統往往不會很複雜。也不會迭代出許多功能。因此規模是比較固定且比較小的,不會帶來很多的複雜度。

    從我們的分析中可以看出,學生管理系統是一個並不複雜的系統,我們真正需要着重考慮的就只有數據高可靠和數據安全兩方面。面對複雜的系統,我們也應該按照這個步驟來思考並設計出合理的架構。在合理的情況下,盡量減少系統的複雜度。

    架構設計原則

    前面我們提到,架構師的工作其實就是在多種選項中做出合理的取捨,取捨沒有對錯之分,只有是否合適一說。為了更好的做出選擇,架構設計應該遵循三個原則:合適原則、簡單原則、演化原則。下面我來一一介紹這三個原則。

    合適原則

    我們一直在說,架構設計中架構師要做出取捨,選擇合適的架構。之所以一直強調合適,是因為我們在架構設計過程中需要結合實際情況來考慮。

    那麼脫離實際情況的設計通常是怎樣發生的呢?不知道大家在開發時有沒有遇到過這樣的需求:“我們決定做一個電商網站,就按照淘寶做一個一模一樣的吧。“這時作為開發的你一定是黑人問號臉,心裏也會萬馬奔騰。

    在架構設計時也是一樣,最忌諱的就是不顧實際情況,盲目的使用業界最優的架構設計。有同學可能不太理解,使用最優設計有什麼錯呢?

    這裏我們所說的實際情況就是你的業務。試想如果你的業務剛剛起步,QPS剛過百,這時,你設計的架構是能支持1000QPS還是3000QPS對於系統來說沒什麼區別。但對於開發成本來說就提升了不止3倍。而對於這樣的業務體量來說,開發團隊一般只有十幾人或幾十人這樣的規模。要讓這樣的團隊來開發的話,大概率是無法完成的。

    演化原則

    聊完了合適原則,我們再來聊一聊演化原則。就像北京的城市規劃一樣,它一定是先有二環,慢慢向外擴建,才逐漸有了三四五六環。而我們現在所使用的大多數軟件,也都是經過了許多版本的迭代才有了現在的功能。

    對於一名合格的架構師來說,我們首先要遵循合適原則,然後再逐步演化。切不可想着一步到位,從而引起過度設計。當業務發展到一定階段時,我們不可避免的會需要對架構進行擴展、重構甚至重寫。在這一過程中,我們應該保留下好的設計,對不好的設計進行完善。就像淘寶的架構一樣,它是經歷了多次“雙十一”之後,才有了現在這樣能支撐每天上千億成交額的架構。

    因此,我們在設計架構時要遵循的第二個原則就是循序漸進的演化原則,而不是追求一步到位。

    簡單原則

    最後再來說簡單原則。前面我們也說了,架構設計其實是在和系統的複雜度做鬥爭。為什麼要有簡單原則?我認為原因主要有兩點。

    第一,複雜的架構開發成本更高。在開發資源有限的情況下,如果我們的架構設計很複雜,勢必會提升開發成本。而對於當今飛速發展的市場來說,時間就是生命。如果你設計的架構開發周期非常長,那麼公司也許就會放棄這個項目,那麼架構也就沒有存在的意義了。

    第二,複雜的架構往往會帶來更多的故障。舉個栗子,電動牙刷和普通牙刷相比,壞的概率一定會高一點,電動牙刷可能出現刷頭磨損,電路問題,充電故障等等,而普通牙刷只會出現刷頭磨損的情況。也就是說,系統的組件越多,系統出現故障的概率也就越大。在此基礎上還有一個問題就是,一旦出了故障,定位問題的速度而言,簡單系統相較於複雜系統也有着很大的優勢。

    至此,架構設計的三個原則我們都已經聊完了。細心的同學可能注意到了,我在詳細介紹時的順序和最開始提到的順序並不一致。這不是我不注意細節。而是我在詳細介紹時,對這三個原則的重要程度排了一個順序。這也是作為架構師的一種取捨,當三種原則無法同時滿足時,應該以哪個為重?這裏我的答案是合適>演化>簡單

    關於架構設計,我已經有了一個大體的認識,不知道在讀完本文以後你是否也有同樣的感覺。如果有任何困惑,歡迎和我一起討論交流。

    最後,架構師是需要有很深的技術積累的,而我在這方面做得還不夠。所以後面還是要以技術積累為主,同時也會嘗試將架構設計的知識引入到日常工作中。後續有什麼新的體會我會繼續和大家分享。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

  • 科學家發現新型態鈾 恐影響核廢料處理計畫

    環境資訊中心綜合外電;姜唯 編譯;林大利 審校

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

  • 澳洲野火不止 維州熱浪祭禁火令 擬照辦跨年煙火秀

    摘錄自2019年12月30日中央通訊社報導

    澳洲野火肆虐,重創當地生態環境及空氣品質,已逾26萬人連署,建議取消知名的雪梨跨年煙火秀,以免助長空氣污染,把錢省下來幫助受災農民及消防員等,不過,雪梨市長克洛弗.摩爾(Clover Moore)已煙火秀照舊,且據報導,高達10萬支煙火都已裝船開運,其中有8成來自中國。

    綜合媒體報導,雪梨是全球最早迎接新年的大城市之一,跨年煙火秀更是全球慶祝跨年的重點戲之一,去(2018)年就花了580萬澳元(約1.2億元台幣),今年打算花650萬澳元(約1.36億台幣)來辦跨年煙火秀,但今年正值澳洲發生數十年來最嚴重的野火災難,致農損嚴重,截至目前並未撲滅,致使澳洲民眾在網上連署,建議當局取消今年跨年煙火秀。

    不過當局並不打算取消,女市長摩爾並表示,若是取消,可能重創雪梨商家們,也會毀了數以萬計前來雪梨參加跨年活動人們的計劃。

    即使如此,這場煙火秀是否在最後喊停,還在未定之天,因為,澳洲野火未停,仍有接近100個火場火勢仍未撲滅,雪梨所屬的新南威爾斯省的災情最嚴重,且位於雪梨西南面的巴爾莫勒爾鎮幾乎全毀,許多公路仍然封閉;且產生的空氣污染已經形成有毒煙霧,籠罩雪梨及其他主要城市。

    由於East Gippsland的森林火災不斷升級,加上熱浪來襲,預計今天氣溫可能升高到44度,維多利亞州當局已在昨天(29日)下令,全面撤離Goongerah和Martins Creek地區居民,今天更將全州實行禁火令,嚴禁人們在戶外用火。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 菲擬重啟核電 地震帶問題未解

    摘錄自2019年12月27日自由時報報導

    菲律賓能源部長庫希(Alfonso Cusi)接受英國金融時報訪問表示,為了解決未來可能出現的能源匱乏問題,菲律賓已經與國際原子能總署(IAEA)合作,努力達成聯合國監管機構要求的安全條件,擬重啟已被擱置許久的核電廠計畫。

    菲律賓前獨裁領袖馬可仕擔任總統時,曾在首都馬尼拉附近的巴丹半島建造核電廠,因民眾反彈聲浪,巴丹核電廠計畫於1986年,被時任總統柯拉蓉.艾奎諾擱置。

    菲律賓西邊的南海雖然富含石油與天然氣資源,但因主權爭議使菲國無法開採。庫希表示,菲國需要穩固、可靠、負擔得起的能源,而核能正好符合上述條件。菲國總統杜特蒂今年十月訪問莫斯科時,與俄方簽署合作意向書。庫希說,為重啟核電廠,菲國考慮和南韓合作,也不排除向原始建造商美國西屋電氣尋求協助,但一切都尚未確定。

    評論家指出,巴丹核電廠有雙重風險,它不只選址於環太平洋地震帶,甚至選在一座休眠火山上,核能污染的危險性恐因該地的地質環境而惡化。對此,菲國能源部去年曾發表文章澄清,巴丹核電廠並非選址於火山口,且專家研判,像日本福島震災一樣芮氏規模九的強震,幾乎不可能在菲國發生。

    庫希表示,在所有相關法案通過後,尚需七至八年才能完成核電廠計畫,在這期間,他們也會持續尋找其他可用能源,例如油、煤、天然氣、再生能源等。

    由於核電廠造價不菲,且菲律賓已有其他大型建設延宕,不少分析師懷疑菲國是否有能力執行核電廠計畫。能源諮詢公司伍德麥肯茲(Wood Mackenzie)的亞太研究主管哈伍德(Andrew Harwood)指出,重啟巴丹核電廠需要巨額資金,使用煤與其他再生能源是最便宜且可行方法。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

  • 擴大中國電動車佈局 鴻海今年據點數可能突破 10 個

    鴻海集團擬擴大在大陸電動車租車佈局,繼成功搶佔北京、杭州、常州後,7 月即將前進貴陽。鴻海指出,去年北京成功試點後,已累積相當經驗,今年將加速複製,內部規畫今年據點數可望突破 10 個,相較去年僅有北京 1 個據點,年成長逾 10 倍。   鴻海進軍電動車市場動作頻頻,繼去年與大陸北汽集團合作,共同組成新能源汽車租賃公司北京恆譽,搶進分時租車市場後,歷經一年,目前北京恆譽共設有 200 個充電椿,並提供 1,000 多輛北汽「E150EV」電動車供租賃。   今年鴻海集團還將大刀闊斧展開擴點,光是上半年就已順利進駐杭州、常州,貴陽也預定 7 月進駐,屆時將成立黔譽的子公司負責管理。據了解,目前鴻海手中還有幾個新點在考慮中,包括上海、深圳、梧州,目標是今年底前總據點數突破 10 個的基本門檻。   法人指出,鴻海透過電動車租賃,提前卡位電動車市場,目標不單是電動車租賃市場,更重要的是後面的代工市場,將電動車市場大餅做大,最大獲益者還是鴻海集團。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

  • 以色列電動車快速充電技術 僅需 5 分鐘充飽電

    以色列初創公司 StoreDot 曾研發 30 秒快速手機充電技術,最近 StoreDot 將這項技術延伸至電動車電池上。StoreDot 研發的汽車版電池,只需 5 分鐘就能充滿,跟在油站入油分別不大。   專為電動車研發的 FlashBattery 電池可算是 StoreDot 手機電池的放大版,利用比傳統鋰離子科技更安全和穩定的有機化合物製作。FlashBattery 的最大好處是在極短時間充滿之餘,同時擁有較長的壽命。StoreDot 表示 FlashBattery 可以充電和放電過千次,比起鋰電池多三倍。   這款高效電池仍在研發中,在推出車用電池之前,StoreDot 會在今年年底前正式推出手機版,以電動車版電池原型預計要到明年底才會現身。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 2015中國國際電動車、電池技術展示交易會圓滿閉幕

    2015中國國際電動車、電池技術展示交易會圓滿閉幕

    2015中國(北京)國際電動車技術展示交易會、第十二屆中國國際電池產品及原輔材料、零配件、機械設備展示交易會於2015年6月5日在北京中國國際展覽中心(老館)圓滿閉幕。自1997年以來,北京華興東方展覽有限公司在北京已經成功舉辦了十二屆國際電池展示交易會,已成為中國乃至亞太地區最重要、規模最大的電池專業展。

    儘管天氣比較炎熱,但絲毫沒有影響到參觀者的熱情。無論是規模、檔次、展商參展規格、媒體報導密度還是觀眾參與熱情都創新高。不僅吸引了新能源汽車產業鏈相關行業的極大關注,也進一步推動了國際間、企業間、政企之間的廣泛合作交流,共同擴大了新能源汽車企業品牌的影響力和競爭力。

    陣容強大  涵蓋新能源全產業鏈

    Battery China 2015/EVTec China 2015展覽面積30,000平方米,1500個展位,彙集300多家國內外知名企業參展。參展商來自中國大陸、中國香港、中國臺灣、韓國、美國、日本、德國、瑞士、比利時、英國、加拿大、瑞典等30多個國家和地區,除此之外,中國自主品牌的新能源汽車成為本屆展會的一大亮點。一汽集團、比亞迪、江淮、騰勢、奇瑞、東風日產、上汽、宇通等全力參展,以嶄新的姿態展示了各車型的技術亮點、出色的外觀和自主品牌創新力量的崛起;同時,優科新能源、首鋼機電、琥珀新能源、飛宏科技、BESK、Torjan、JM Energy、台塑、雙登、天能、超微、波士頓、欣旺達、普萊德、神州巨電、河南鋰動、長虹、佳貝思、威星、中航鋰電、猛獅、錢江鋰電、天康、西門子、中茂電子、嘉拓、七星華創、鴻寶、滄州明珠、中平瀚博等眾多電池企業也向觀眾展示最新動態、最新技術、最新工藝、最新產品。

    此次展會彙集行業內主流電動車整車和電池企業,展示範圍涵蓋新能源汽車及動力電池、儲能電池全產業鏈。同時,展臺前人氣爆棚,觀展者們圍著各個品牌電動車車型仔細詢問,現場不少觀眾紛紛預約試駕了電動車,體驗了電動車的完美操控性。此外,各廠家還通過視頻、車型展示、互動體驗方式,極大地豐富了觀眾參觀體驗,再度顯示了創新引領技術改變的前瞻理念。

    本屆展會既是新產品、新技術的展示平臺,也是新能源汽車發展趨勢的風向標。充分展現了當今世界新能源汽車的最新成果和發展趨勢。隨著越來越多企業選擇“中國(北京)國際電動車技術展示交易會”,作為其新品發佈的戰略平臺,標誌著EVTec China 2015和 Battery China 2015已經成為具備國際影響力的一流展會,進一步推廣了綠色新能源汽車的環保發展理念。

    專業交流  探究新能源合作發展

    6月4日,主辦方還舉辦了中國電動車動力電池市場發展及技術論壇,來自行業領導、中外汽車及電池領域高管、專家學者以及KBIA、VDMA協會代表等200人出席了會議,共同探討新能源的發展路徑,並就節能減排、電動車及動力電池市場發展及技術最新趨勢、新能源汽車的推廣與普及,以及企業間的全球交流與合作進行了深入的研討和交流。除此之外,專家們在關注市場和前沿技術的同時,以最新的研究成果,分享了業內資訊與資源的共用,極大推動了國際間、企業間、政企間的交流合作。同時,觀眾們通過現場體驗及與專業人員的詳細交流也對新能源汽車有了更深入的認識和瞭解。

    專業權威  樹立新能源產業推廣的新平臺

    由北京華興東方展覽有限公司、中國北方車輛研究所國家863電動車重大專項動力電池測試中心、北京市新能源汽車發展促進中心、北京新能源汽車產業協會共同主辦的2015中國(北京)國際電動車技術展示交易會、第十二屆中國國際電池產品及原輔材料、零配件、機械設備展示交易會影響力凸顯,依託首都北京的政治和經濟優勢、便利的交通條件和完善的會展服務設施,成功打造了一場國際性新能源汽車產業鏈的展覽及交流平臺。

    2017年,我們相約北京。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

  • MySQL 執行計劃詳解

    MySQL 執行計劃詳解

    MySQL 原理篇

    我們經常使用 MySQL 的執行計劃來查看 SQL 語句的執行效率,接下來分析執行計劃的各個显示內容。

    EXPLAIN SELECT * FROM users 
    WHERE id IN (SELECT userID FROMuser_address WHERE address = "湖南長沙麓谷") ;

    執行計劃的 id

    select 查詢的序列號,標識執行的順序

    • id 相同,執行順序由上至下
    • id 不同,如果是子查詢,id 的序號會遞增,id 值越大優先級越高,越先被執行

    執行計劃的 select_type

    查詢的類型,主要是用於區分普通查詢、聯合查詢、子查詢等。

    • SIMPLE:簡單的 select 查詢,查詢中不包含子查詢或者 union
    • PRIMARY:查詢中包含子部分,最外層查詢則被標記為 primary
    • SUBQUERY/MATERIALIZED:SUBQUERY 表示在 select 或 where 列表中包含了子查詢,MATERIALIZED表示 where 後面 in 條件的子查詢
    • UNION:表示 union 中的第二個或後面的 select 語句
    • UNION RESULT:union 的結果

    對於 UNION 和 UNION RESULT 可以通過下面的例子展現:

    EXPLAIN
    SELECT * FROM users WHERE id IN(1, 2)
    UNION
    SELECT * FROM users WHERE id IN(3, 4);

    執行計劃的 table

    查詢涉及到的表。

    • 直接顯示錶名或者表的別名
    • <unionM,N> 由 ID 為 M,N 查詢 union 產生的結果
    • <subqueryN> 由 ID 為 N 查詢產生的結果

    執行計劃的 type 

    訪問類型,SQL 查詢優化中一個很重要的指標,結果值從好到壞依次是:system > const > eq_ref > ref > range > index > ALL。

    • system:系統表,少量數據,往往不需要進行磁盤IO
    • const:常量連接
    • eq_ref:主鍵索引(primary key)或者非空唯一索引(unique not null)等值掃描
    • ref:非主鍵非唯一索引等值掃描
    • range:範圍掃描
    • index:索引樹掃描
    • ALL:全表掃描(full table scan)

    下面通過舉例說明。

    system

    explain select * from mysql.time_zone;

    上例中,從系統庫 MySQL 的系統表 time_zone 里查詢數據,訪問類型為 system,這些數據已經加載到內存里,不需要進行磁盤 IO,這類掃描是速度最快的。

    explain select * from (select * from user where id=1) tmp;

    再舉一個例子,內層嵌套(const)返回了一個臨時表,外層嵌套從臨時表查詢,其掃描類型也是 system,也不需要走磁盤 IO,速度超快。

    const 

    數據準備:

    CREATE TABLE `user` (
      `id` int(11) NOT NULL,
      `NAME` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user values(1,'shenjian');
    insert into user values(2,'zhangsan');
    insert into user values(3,'lisi');
    explain select * from user where id=1;

    const 掃描的條件為: 

    1. 命中主鍵(primary key)或者唯一(unique)索引
    2. 被連接的部分是一個常量(const)值 

    如上例,id 是 主鍵索引,連接部分是常量1。

    eq_ref

    數據準備:

    CREATE TABLE `user` (
      `id` int(11) NOT NULL,
      `NAME` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user values(1,'shenjian');
    insert into user values(2,'zhangsan');
    insert into user values(3,'lisi');
    
    CREATE TABLE `user_ex` (
      `id` int(11) NOT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user_ex values(1,18);
    insert into user_ex values(2,20);
    insert into user_ex values(3,30);
    insert into user_ex values(4,40);
    insert into user_ex values(5,50);
    EXPLAIN SELECT * FROM USER,user_ex WHERE user.id=user_ex.id;

    eq_ref 掃描的條件為,對於前表的每一行(row),后表只有一行被掃描。 

    再細化一點:  

    1. join 查詢
    2. 命中主鍵(primary key)或者非空唯一(unique not null)索引
    3. 等值連接;

    如上例,id 是主鍵,該 join 查詢為 eq_ref 掃描。

    ref

    數據準備:

    CREATE TABLE `user` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      KEY `id` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user values(1,'shenjian');
    insert into user values(2,'zhangsan');
    insert into user values(3,'lisi');
    
    CREATE TABLE `user_ex` (
      `id` int(11) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      KEY `id` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user_ex values(1,18);
    insert into user_ex values(2,20);
    insert into user_ex values(3,30);
    insert into user_ex values(4,40);
    insert into user_ex values(5,50);
    EXPLAIN SELECT * FROM USER,user_ex WHERE user.id=user_ex.id;

    如果把上例 eq_ref 案例中的主鍵索引,改為普通非唯一(non unique)索引。就由 eq_ref 降級為了 ref,此時對於前表的每一行(row),后表可能有多於一行的數據被掃描。

    select * from user where id=1;

    當 id 改為普通非唯一索引后,常量的連接查詢,也由 const 降級為了 ref,因為也可能有多於一行的數據被掃描。

    ref 掃描,可能出現在 join 里,也可能出現在單表普通索引里,每一次匹配可能有多行數據返回,雖然它比 eq_ref 要慢,但它仍然是一個很快的 join 類型。

    range

    數據準備:

    CREATE TABLE `user` (
      `id` int(11) NOT NULL,
      `name` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user values(1,'shenjian');
    insert into user values(2,'zhangsan');
    insert into user values(3,'lisi');
    insert into user values(4,'wangwu');
    insert into user values(5,'zhaoliu');
    explain select * from user where id between 1 and 4;
    explain select * from user where id in(1,2,3);
    explain select * from user where id > 3;

    range 掃描就比較好理解了,它是索引上的範圍查詢,它會在索引上掃碼特定範圍內的值。

    像上例中的 between,in,> 都是典型的範圍(range)查詢。

    index

    explain count (*) from user;

    如上例,id 是主鍵,該 count 查詢需要通過掃描索引上的全部數據來計數,它僅比全表掃描快一點。

    ALL 

    數據準備:

    CREATE TABLE `user` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user values(1,'shenjian');
    insert into user values(2,'zhangsan');
    insert into user values(3,'lisi');
    
    CREATE TABLE `user_ex` (
      `id` int(11) DEFAULT NULL,
      `age` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into user_ex values(1,18);
    insert into user_ex values(2,20);
    insert into user_ex values(3,30);
    insert into user_ex values(4,40);
    insert into user_ex values(5,50);
    explain select * from user,user_ex where user.id=user_ex.id;

    如果 id 上不建索引,對於前表的每一行(row),后表都要被全表掃描。

    文章中,這個相同的 join 語句出現了三次:

    1. 掃描類型為 eq_ref,此時 id 為主鍵
    2. 掃描類型為 ref,此時 id 為非唯一普通索引
    3. 掃描類型為 ALL,全表掃描,此時id上無索引

    有此可見,建立正確的索引,對數據庫性能的提升是多麼重要。

    總結 

    1. explain 結果中的 type 字段,表示(廣義)連接類型,它描述了找到所需數據使用的掃描方式;
    2. 常見的掃描類型有:system>const>eq_ref>ref>range>index>ALL,其掃描速度由快到慢;
    3. 各類掃描類型的要點是:
      1. system 最快:不進行磁盤 IO
      2. const:PK 或者 unique 上的等值查詢
      3. eq_ref:PK 或者 unique 上的 join 查詢,等值匹配,對於前表的每一行,后表只有一行命中
      4. ref:非唯一索引,等值匹配,可能有多行命中
      5. range:索引上的範圍掃描,例如:between、in、>
      6. index:索引上的全集掃描,例如:InnoDB 的 count
      7. ALL 最慢:全表掃描
    1. 建立正確的索引,非常重要;
    2. 使用 explain 了解並優化執行計劃,非常重要;

    執行計劃 possible_keys

    查詢過程中有可能用到的索引。

    執行計劃 key

    實際使用的索引,如果為 NULL ,則沒有使用索引。

    執行計劃 rows

    根據表統計信息或者索引選用情況,大致估算出找到所需的記錄所需要讀取的行數。

    執行計劃 filtered 

    表示返回結果的行數占需讀取行數的百分比, filtered 的值越大越好。

    執行計劃 Extra 

    十分重要的額外信息。

    • Using filesort:MySQL 對數據使用一個外部的文件內容進行了排序,而不是按照表內的索引進行排序讀取。
    • Using temporary:使用臨時表保存中間結果,也就是說 MySQL 在對查詢結果排序時使用了臨時表,常見於order by 或 group by。
    • Using index:表示 SQL 操作中使用了覆蓋索引(Covering Index),避免了訪問表的數據行,效率高。
    • Using index condition:表示 SQL 操作命中了索引,但不是所有的列數據都在索引樹上,還需要訪問實際的行記錄。
    • Using where:表示 SQL 操作使用了 where 過濾條件。
    • Select tables optimized away:基於索引優化 MIN/MAX 操作或者 MyISAM 存儲引擎優化 COUNT(*) 操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即可完成優化。
    • Using join buffer (Block Nested Loop):表示 SQL 操作使用了關聯查詢或者子查詢,且需要進行嵌套循環計算。

    下面通過舉例說明。

    數據準備:

    CREATE TABLE `user` (
      `id` int(11) NOT NULL,
      `name` varchar(20) DEFAULT NULL,
      `sex` varchar(5) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    insert into user values(1, 'shenjian','no');
    insert into user values(2, 'zhangsan','no');
    insert into user values(3, 'lisi', 'yes');
    insert into user values(4, 'lisi', 'no');

    數據說明:

    用戶表:id 主鍵索引,name 普通索引(非唯一),sex 無索引。

    四行記錄:其中 name 普通索引存在重複記錄 lisi。

    Using filesort

    explain select * from user order by sex;

     

    Extra 為 Using filesort 說明,得到所需結果集,需要對所有記錄進行文件排序。

    這類 SQL 語句性能極差,需要進行優化。

    典型的,在一個沒有建立索引的列上進行了 order by,就會觸發 filesort,常見的優化方案是,在 order by 的列上添加索引,避免每次查詢都全量排序。

    Using temporary

    explain select * from user group by name order by sex;

    Extra 為 Using temporary 說明,需要建立臨時表(temporary table)來暫存中間結果。

    這類 SQL 語句性能較低,往往也需要進行優化。

    典型的 group by 和 order by 同時存在,且作用於不同的字段時,就會建立臨時表,以便計算出最終的結果集。

    臨時表存在兩種引擎,一種是 Memory 引擎,一種是 MyISAM 引擎,如果返回的數據在 16M 以內(默認),且沒有大字段的情況下,使用 Memory 引擎,否則使用 MyISAM 引擎。 

    Using index

    EXPLAIN SELECT id FROM USER;

    Extra 為 Using index 說明,SQL 所需要返回的所有列數據均在一棵索引樹上,而無需訪問實際的行記錄。

    這類 SQL 語句往往性能較好。

    Using index condition

    explain select id, name, sex from user where name='shenjian';

    Extra 為 Using index condition 說明,確實命中了索引,但不是所有的列數據都在索引樹上,還需要訪問實際的行記錄。

    這類 SQL 語句性能也較高,但不如 Using index。

    Using where

    explain select * from user where sex='no';

    Extra 為 Using where 說明,查詢的結果集使用了 where 過濾條件,比如上面的 SQL 使用了 sex = 'no' 的過濾條件

    Select tables optimized away

    EXPLAIN SELECT MAX(id) FROM USER;

     

    比如上面的語句查詢 id 的最大值,因為 id 是主鍵索引,根據 B+Tree 的結構,天然就是有序存放的,所以不需要等到執行階段再進行計算,查詢執行計劃生成的階段即可完成優化。

    Using join buffer (Block Nested Loop)

    explain select * from user where id in (select id from user where sex='no');

    Extra 為 Using join buffer (Block Nested Loop) 說明,需要進行嵌套循環計算。內層和外層的 type 均為 ALL,rows 均為4,需要循環進行4*4次計算。

    這類 SQL 語句性能往往也較低,需要進行優化。

    典型的兩個關聯表 join,關聯字段均未建立索引,就會出現這種情況。常見的優化方案是,在關聯字段上添加索引,避免每次嵌套循環計算。

    參考 

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

  • 電腦屏幕太小不夠用?這有妙招!

    電腦屏幕太小不夠用?這有妙招!

    前段時間跟大家探討了 Vim 的顏色方案的話題,取得了不錯的反響,大家可以點擊以下鏈接回顧那篇文章:

    今天我們來介紹 Vim 的分屏功能

    為什麼需要分屏功能?其實需求場合有很多。比如,我現在屏幕很大,但我們的代碼一般是左對齊,右邊很空,這樣我們就可以通過分屏來充分利用右邊的屏幕。再如,我現在想同時查看多個文檔,除了打開多個終端外,我們還可以通過分屏來達到我們的目的。

    當然類似的場合還有很多,只要我們充分挖掘,肯定能挖掘出更多需求。

    下面我們就來詳細介紹 Vim 的分屏操作。

    分屏功能基本操作

    首先我們隨便打開一個代碼文件。為了方便演示,代碼長度越長越好。

    vim test.c

    現在讓我們將界面分成左右兩部分。首先我們按 ctrl+w ,緊接着按 v 。這樣操作之後,屏幕就一分為二了,如下圖示:

    如果我們想要三等分怎麼操作?很簡單,在上面的基礎之上,我們再次執行一遍上面的操作,屏幕就三等分了。

    如果你覺得這樣操作太麻煩,我們還可以通過在末行模式執行以下命令達到同樣的效果:

    :vsplit

    既然是命令,那就肯定有縮寫:

    :vsp

    簡直簡單到離譜…來點有水平的~讓我們從頭開始,這次我們將屏幕進行橫向分割。首先我們在末行模式下運行以下命令:

    :split

    同樣的,我們也有縮寫命令:

    :sp

    這個功能也可通過鍵盤組合鍵實現。對於水平分割來講,先按 ctrl + w ,然後按 s 。同樣,所有這些字母都是小寫的,並且是英文輸入狀態。

    分屏之間切換

    如前文所言,分屏在很多場景下非常有用,但是,你如果不能從一個分屏切換到另一個分屏,那這種拆分視圖就完全沒意義了。下面讓我給大家展示如何從一個分屏切換另一個分屏。

    在這裏,我設置了同一文件的4個分割視圖。

    剛開始時,光標位於第一個分屏。現在,假如我們要切換到右側分屏,我們需要先按 ctrl + w ,然後按 l

    同樣地,假如我們要切換到左側窗口,需要先按 ctrl + w ,然後按 h

    如果你是進行橫向分割屏幕的,那麼就只能上下移動光標。要切換到上面的分屏,需要先按 ctrl + w ,然後按 k

    同樣地,如果想要切換到下面的分屏,那麼就需要先按 ctrl + w,然後按 j

    在不同分屏下進行編輯

    到此為止,我相信大家已經學會了怎麼進行分屏操作了。那分完屏,我們怎麼在這些分屏下進行文本編輯呢?其實,每個分屏都可以視為一個完整的 Vim 窗口,我們平常怎麼編輯的,就怎樣去編輯文檔。

    複製及粘貼操作

    與未分屏是基本無差的,大家可以在從一個分屏里複製一段文本,再切換到另一個分屏進行粘貼。操作都是一樣的,只是需要在不同分屏里切換而已。

    改變分屏尺寸

    默認情況下,Vim 是按等分進行分屏操作的。如果我們想最大化/最小化某個分屏,要如何操作?

    如果要將當前窗口加寬到最大尺寸,需要先按 ctrl + w ,然後按 |(注意:不是小寫 L ,是與或非的那個與 | )。

    如果你想把當前窗口高度加高到最大尺寸,那麼需要使用 ctrl + w ,然後使用 **_** 。

    那如果想要重置所有分割窗口的大小,那麼使用 ctrl+w ,然後按 =

    默認情況下,Vim 在進行分屏操作時,每個分屏是等寬或等高的。如果要自定義分屏的寬度,大家可以使用以下結構:

    :<width> vsp

    同樣地,對於水平分割而言,可以使用類似結構自定義高度:

    :<height> sp

    在同一個 Vim 窗口下打開多個不同文件

    目前為止,所有的 Vim 分屏都是同一個文件的副本,但在很多情況下,我們需要打開多個不同的文件。我們可以將 Vim 窗口進行分屏,再在不同的分屏里打開不同的文件。

    如何在 Vim 中打開一個新文件?我們可以使用以下命令:

    :e<path_to_file>/filename.extension

    例如,我們想要在一個全新的 Vim 實例中打開 vimrc,我們可以使用以下命令:

    :e~/.vimrc

    打開 vimrc 之後,我們想要將屏幕水平切分並打開一個新文件,可以使用以下命令:

    :sp<file_path>

    而對於垂直分割屏幕,使用的也是類似的結構:

    :vsp<file_path>

    小結

    Vim 分屏講到這裏就要跟大家告一段落了。這種操作還是比較有趣,並且十分實用。

    本文介紹了 Vim 分屏的一些基本操作及編輯方法,合理利用這個功能可以使我們更加高效使用電腦屏幕,提高我們的效率。
    —————–

    我是良許,世界500強外企 Linux 開發工程師,專業生產 Linux 乾貨。歡迎關注我的公眾號「良許Linux」,裏面分享了 Linux入門、基礎、進階 等系列教程,同時也有 Git、Vim、開源項目 等技術乾貨。公眾號後台回復「1024」獲取最新最全的技術資料,回復「入群」進入高手如雲技術交流群。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!