歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOCX文檔下載  

10大sql書寫規(guī)范實戰(zhàn)技巧sql書寫優(yōu)化建議

  • 資源ID:199336172       資源大?。?span id="0lc0h0q" class="font-tahoma">397.02KB        全文頁數(shù):10頁
  • 資源格式: DOCX        下載積分:9.98積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要9.98積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

10大sql書寫規(guī)范實戰(zhàn)技巧sql書寫優(yōu)化建議

SQL調(diào)優(yōu) | SQL 書寫規(guī)范及優(yōu)化技巧10 個sql書寫規(guī)范及優(yōu)化技巧:一、 使用延遲查詢優(yōu)化 limit offset, rows經(jīng)常出現(xiàn)類似以下的 SQL 語句:SELECT * FROM film LIMIT 100000, 10offset 特別大!這是我司出現(xiàn)很多慢 SQL 的主要原因之一,尤其是在跑任務需要分頁執(zhí)行時,經(jīng)常跑著跑著 offset 就跑到幾十萬了,導致任務越跑越慢。LIMIT 能很好地解決分頁問題,但如果 offset 過大的話,會造成嚴重的性能問題,原因主要是因為 MySQL 每次會把一整行都掃描出來,掃描 offset 遍,找到 offset 之后會拋棄 offset 之前的數(shù)據(jù),再從 offset 開始讀取 10 條數(shù)據(jù),顯然,這樣的讀取方式問題??梢酝ㄟ^延遲查詢的方式來優(yōu)化假設有以下 SQL,有組合索引(sex, rating)SELECT <cols> FROM profiles where sex='M' order by rating limit 100000, 10;則上述寫法可以改成如下寫法這里利用了覆蓋索引的特性,先從覆蓋索引中獲取 100010 個 id,再丟充掉前 100000 條 id,保留最后 10 個 id 即可,丟掉 100000 條 id 不是什么大的開銷,所以這樣可以顯著提升性能二、 利用 LIMIT 1 取得唯一行數(shù)據(jù)庫引擎只要發(fā)現(xiàn)滿足條件的一行數(shù)據(jù)則立即停止掃描,這種情況適用于只需查找一條滿足條件的數(shù)據(jù)的情況三、 注意組合索引,要符合最左匹配原則才能生效假設存在這樣順序的一個聯(lián)合索引“col_1, col_2, col_3”。這時,指定條件的順序就很重要。前面兩條會命中索引,第三條由于沒有先匹配 col_1,導致無法命中索引, 另外如果無法保證查詢條件里列的順序與索引一致,可以考慮將聯(lián)合索引 拆分為多個索引。四、使用 LIKE 謂詞時,只有前方一致的匹配才能用到索引(最左匹配原則)上例中,只有第三條會命中索引,前面兩條進行后方一致或中間一致的匹配無法命中索引五、 簡單字符串表達式模型字符串可以使用 _ 時, 盡可能避免使用 %, 假設某一列上為 char(5)不推薦推薦六、盡量使用自增 id 作為主鍵比如現(xiàn)在有一個用戶表,有人說身份證是唯一的,也可以用作主鍵,理論上確實可以,不過用身份證作主鍵的話,一是占用空間相對于自增主鍵大了很多,二是很容易引起頻繁的頁分裂,造成性能問題(什么是頁分裂,請參考這篇文章)主鍵選擇的幾個原則:自增,盡量小,不要對主鍵進行修改七、如何優(yōu)化 count(*)使用以下 sql 會導致慢查詢原因是會造成全表掃描,有人說 COUNT(*) 不是會利用主鍵索引去查找嗎,怎么還會慢,這就要談到 MySQL 中的聚簇索引和非聚簇索引了,聚簇索引葉子節(jié)點上存有主鍵值+整行數(shù)據(jù),非聚簇索葉子節(jié)點上則存有輔助索引的列值 + 主鍵值,如下所以就算對 COUNT(*) 使用主鍵查找,由于每次取出主鍵索引的葉子節(jié)點時,取的是一整行的數(shù)據(jù),效率必然不高,但是非聚簇索引葉子節(jié)點只存儲了列值 + 主鍵值,這也啟發(fā)我們可以用非聚簇索引來優(yōu)化,假設表有一列叫 status, 為其加上索引后,可以用以下語句優(yōu)化:SELECT COUNT(status) FROM SomeTable有人曾經(jīng)測過(見文末參考鏈接),假設有 100 萬行數(shù)據(jù),使用聚簇索引來查找行數(shù)的,比使用 COUNT(*) 查找速度快 10 幾倍。不過需要注意的是通過這種方式無法計算出 status 值為 null 的那些行如果主鍵是連續(xù)的,可以利用 MAX(id) 來查找,MAX 也利用到了索引,只需要定位到最大 id 即可,性能極好,如下,秒現(xiàn)結果SELECT MAX(id) FROM SomeTable說句題句話,有人說用 MyISAM 引擎調(diào)用 COUNT(*) 非???,那是因為它提前把行數(shù)存在磁盤中了,直接拿,當然很快,不過如果有 WHERE 的限制八、避免使用 SELECT * ,盡量利用覆蓋索引來優(yōu)化性能SELECT * 會提取出一整行的數(shù)據(jù),如果查詢條件中用的是組合索引進行查找,還會導致回表(先根據(jù)組合索引找到葉子節(jié)點,再根據(jù)葉子節(jié)點上的主鍵回表查詢一整行),降低性能,而如果我們所要的數(shù)據(jù)就在組合索引里,只需讀取組合索引列,這樣網(wǎng)絡帶寬將大大減少,假設有組合索引列 (col_1, col_2)推薦用SELECT col_1, col_2 FROM SomeTable WHERE col_1 = xxx AND col_2 = xxx不推薦用SELECT * FROM SomeTable WHERE col_1 = xxx AND col_2 = xxx九、 如有必要,使用 force index() 強制走某個索引業(yè)務團隊曾經(jīng)出現(xiàn)類似以下的慢 SQL 查詢post_id 也加了索引,理論上走 post_id 索引會很快查詢出來,但實現(xiàn)了通過 EXPLAIN 發(fā)現(xiàn)走的卻是 id 的索引(這里隱含了一個常見考點,在多個索引的情況下, MySQL 會如何選擇索引),而 id > 0 這個查詢條件沒啥用,直接導致了全表掃描, 所以在有多個索引的情況下一定要慎用,可以使用 force index 來強制走某個索引,以這個例子為例,可以強制走 post_id 索引,效果立桿見影。這種由于表中有多個索引導致 MySQL 誤選索引造成慢查詢的情況在業(yè)務中也是非常常見,一方面是表索引太多,另一方面也是由于 SQL 語句本身太過復雜導致, 針對本例這種復雜的 SQL 查詢,其實用 ElasticSearch 搜索引擎來查找更合適,有機會到時出一篇文章說說。十、 使用 EXPLAIN 來查看 SQL 執(zhí)行計劃上個點說了,可以使用 EXPLAIN 來分析 SQL 的執(zhí)行情況,如怎么發(fā)現(xiàn)上文中的最左匹配原則不生效呢,執(zhí)行 EXPLAIN + SQL 語句可以發(fā)現(xiàn) key 為 None ,說明確實沒有命中索引我司在提供 SQL 查詢的同時,也貼心地加了一個 EXPLAIN 功能及 sql 的優(yōu)化建議,建議各大公司效仿 _,如圖示十一、 批量插入,速度更快當需要插入數(shù)據(jù)時,批量插入比逐條插入性能更高推薦用- 批量插入INSERT INTO TABLE (id, user_id, title) VALUES (1, 2, 'a'),(2,3,'b');不推薦用INSERT INTO TABLE (id, user_id, title) VALUES (1, 2, 'a');INSERT INTO TABLE (id, user_id, title) VALUES (2,3,'b');批量插入 SQL 執(zhí)行效率高的主要原因是合并后日志量 MySQL 的 binlog 和 innodb 的事務讓日志減少了,降低日志刷盤的數(shù)據(jù)量和頻率,從而提高了效率十二、 慢日志 SQL 定位前面我們多次說了 SQL 的慢查詢,那么該怎么定位這些慢查詢 SQL 呢,主要用到了以下幾個參數(shù)這幾個參數(shù)一定要配好,再根據(jù)每條慢查詢對癥下藥,像我司每天都會把這些慢查詢提取出來通過郵件給形式發(fā)送給各個業(yè)務團隊,以幫忙定位解決總結業(yè)務生產(chǎn)中可能還有很多 CASE 導致了慢查詢,其實細細品一下,都會發(fā)現(xiàn)這些都和 MySQL 索引的底層數(shù)據(jù) B+ 樹 有莫大的關系,強烈建議大家看一下我的另一篇介紹 B+ 樹的文章,好評如潮!相信大家看了之后,以上出現(xiàn)的問題會有一個更深層次的理解,掌握底層,以不變應萬變!

注意事項

本文(10大sql書寫規(guī)范實戰(zhàn)技巧sql書寫優(yōu)化建議)為本站會員(ta****fu)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!