国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何使用智能SQL查詢提升應用程序性能?

譯文
數(shù)據(jù)庫 SQL Server
我們常常忘了每個請求與其他請求并非獨立。如果一個請求很慢,它不太可能影響其他請求,是這樣嗎?

【51CTO.com快譯】為什么數(shù)據(jù)庫導致如此多的性能問題?

我們常常忘了每個請求與其他請求并非獨立。如果一個請求很慢,它不太可能影響其他請求,是這樣嗎?

[[355354]]

數(shù)據(jù)庫是由應用程序中運行的所有進程使用的共享資源。即便只有一處設(shè)計不當?shù)脑L問也可能拖累整個系統(tǒng)的性能。

本文討論了一些巧妙的SQL查詢方法,已完全改變了我們系統(tǒng)的一些部分,從而提升了應用程序性能,最終改善客戶體驗。

如果您處理龐大數(shù)據(jù)集、導入/導出過程、數(shù)據(jù)聚合算法以及類似問題,這些解決方案可以幫助您大幅減少應用程序消耗的資源并大幅節(jié)省成本。

INSERT on Duplicate Key UPDATE

insert on duplicate key update是鮮為人知的MySQL子句之一,但它保證了在一些特定情況下可顯著提升性能,實際上確保了客戶體驗。

由于這個子句,您可以指令MySQL運行UPDATE語句,以防INSERT語句因表中可能存在重復鍵而出錯。

不妨給出一個真實的例子。

CSV導入/導出

假設(shè)從CSV文件導入用戶列表的過程,其中每行都需要有唯一的電子郵件地址。如果電子郵件地址已經(jīng)存在,我們的腳本應插入新用戶并更新特定用戶。

該腳本的第一個版本可能是: 

  1. PHP 
  2. // CSV file content 
  3. $csv = [...]; 
  4. foreach($csv as $row) 
  5.     $user = User::firstWhere('email', $row['email']); 
  6.     if(!$user) { 
  7.         $user = new User() 
  8.     } 
  9.     $user->name = $row['name']; 
  10.     // "save" method is smart enough to update a record if it does not exists, otherwise create
  11.     $user->save(); 

我們針對每一行驗證數(shù)據(jù)庫中是否已存在有特定電子郵件的用戶。如果用戶存在,腳本更新其名稱后保存;如果用戶不存在,腳本將創(chuàng)建User的新實例,然后繼續(xù)插入。

在該示例中,我們使用Eloquent ORM與數(shù)據(jù)庫進行交互;“save()”方法足夠聰明,可以更新記錄(如果不存在),否則創(chuàng)建記錄。最后,我們運行select從數(shù)據(jù)庫獲取用戶,然后執(zhí)行另一個查詢以INSERT或UPDATE記錄,因此對CSV文件中的每一行進行了兩次查詢。

這意味著對于擁有500000行的CSV而言,我們需要運行100萬次查詢(50萬次選擇,50萬次插入或更新)。

簡化代碼

Eloquent以及其他所有不錯的ORM都提供了某條捷徑來完成這種操作,因此我們可以使用updateOrCreate方法來減少行數(shù),從而提高可讀性: 

  1. // CSV file content 
  2. $csv = [...]; 
  3. foreach($csv as $row) 
  4.  { 
  5.     User::updateOrCreate( 
  6.         // Identify record by this columns 
  7.         [ 
  8.             'email' => $row['email'
  9.         ], 
  10.         // Other fields to fill 
  11.         [ 
  12.             'name' => $row['email'
  13.         ] 
  14.     ]); 

該方法其實有很清楚的名稱,提供了實用功能,但這還不夠,因為它存在同樣的問題:每一CSV行運行兩次查詢。

太多的查詢意味著太多的時間、CPU和內(nèi)存使用量。我們旨在減少數(shù)據(jù)庫語句的數(shù)量,從而優(yōu)化性能和消耗的資源。

如何使用“on duplicate key”?

該子句好比“try/catch”語句,但面向SQL。這里有個原始的例子: 

  1. INSERT INTO users (email, name)  
  2.     VALUES ('support@inspector.dev''Valerio'
  3. ON DUPLICATE KEY  
  4.     UPDATE users SET name = 'Valerio'

它的行為很簡單:

  • 試圖插入有特定信息的記錄;
  • 如果沒有錯誤,就按往常那樣執(zhí)行插入;
  • 如果查詢出現(xiàn)“重復鍵”錯誤,繼續(xù)執(zhí)行所提供的第二個查詢。

由于該子句,我們可以將“if”語句從PHP移到數(shù)據(jù)庫,把針對數(shù)據(jù)庫本身發(fā)出的請求數(shù)量減少一半。

不妨更進一步

我們還可以使用該SQL語言用于批量操作,以獲得大幅提升性能的效果。我們可以添加多個INSERT,并使用VALUES函數(shù)來引用正確的字段,比如周期中的變量。 

  1. INSERT INTO users (email, name)  
  2.     VALUES 
  3.         ('support@inspector.dev''Valerio'), 
  4.         ('support@inspector.dev''Valerio Barbera'), 
  5.         ('frank@gmail.com''Frank'), 
  6.         ('seb@gmail.com''Sebastian'
  7. ON DUPLICATE KEY  
  8.     UPDATE users SET name = VALUES(name); 

從理論上來說,我們僅用一個查詢即可導入整個CSV。

在實際情況下,查詢有長度限制,避免一次操作執(zhí)行全部任務來得比較謹慎,以免內(nèi)存不足錯誤。我們可以將CSV分成有1000項的子組,并運行內(nèi)有1000次INSERT的查詢: 

  1. // CSV file content 
  2. $csv = [...]; 
  3. $chunks = array_chunk($csv, 1000); 
  4. foreach($chunks as $chunk) { 
  5.     foreach($chunk as $row) { 
  6.         User::updateOrCreate( 
  7.             // Identify record by this columns 
  8.             [ 
  9.                 'email' => $row['email'
  10.             ], 
  11.             // Other fields to fill 
  12.             [ 
  13.                 'name' => $row['email'
  14.             ] 
  15.         ]); 
  16.     } 

1000只是個例子,基于您服務器的資源,您可以加大或調(diào)小這個數(shù)。最重要的是,我們已將查詢數(shù)量從500000次減少至500次。

Eloquent UPSERT 方法

Eloquent ORM提供的upsert方法可為您在底層實現(xiàn)這種策略。 

  1. User::upsert([ 
  2.     ['email' => 'support@inspector.dev''name' => 'Valerio''age' => 25], 
  3.     ['email' => 'support@inspector.dev''name' => 'Valerio Barbera''age' => 35] 
  4. ], ['email'], ['name''age']); 

該方法的第一個參數(shù)由要插入或更新的值組成,第二個參數(shù)列出了唯一標識關(guān)聯(lián)表中記錄的列。方法的第三個也是最后一個參數(shù)是這種列的數(shù)組:如果數(shù)據(jù)庫中已經(jīng)存在匹配的記錄,應更新這些列。

為了使該方法發(fā)揮作用,要求upsert方法的第二個參數(shù)中的列具有“主”或“唯一”索引。

結(jié)論

但愿這一個或多個技巧可以幫助您開發(fā)出可靠性和可擴展性更高的軟件產(chǎn)品。

我已用Eloquent ORM編寫代碼示例,但您可以以同樣的方式對所有主要的ORM使用該策略。工具應幫助我們實施有效的策略。 戰(zhàn)略性思維是從長遠角度看待我們產(chǎn)品的關(guān)鍵。

原文標題:How to Accelerate Application Performance With Smart SQL Queries,作者:Valerio Barbera

【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】

 

責任編輯:華軒 來源: 51CTO
相關(guān)推薦

2011-09-20 10:41:45

Web

2009-07-01 18:24:59

JSP應用程序JMeter

2009-01-08 19:14:37

服務器應用程序SQL Server

2010-02-04 09:41:03

Android應用程序

2023-11-14 08:36:15

Celery工具

2009-01-08 19:11:39

服務器應用程序SQL Server

2009-01-08 19:06:13

服務器應用程序SQL Server

2019-10-17 10:10:23

優(yōu)化Web前端

2011-08-08 13:35:50

Web應用WANWeb應用程序

2014-12-16 09:35:13

DevOps

2010-11-15 16:20:33

Oracle系統(tǒng)優(yōu)化

2011-01-19 11:10:50

程序交付優(yōu)化應用程序性能管理監(jiān)控

2022-07-04 17:32:12

DevOpsAIOps

2012-11-28 11:09:28

IBMdW

2010-07-28 09:25:41

jQueryJavaScript性

2009-07-29 11:33:14

ASP.NET技巧ASP.NET應用程序

2021-08-18 09:37:51

數(shù)據(jù)庫移動應用程序

2015-05-07 09:05:18

2018-11-06 09:53:27

2019-02-01 09:50:00

提升Python程序性能
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品免费免费| 日本一欧美一欧美一亚洲视频| 成人免费淫片免费观看| 美国毛片一区二区三区| 国产精品区一区二区三在线播放| 精品网站aaa| 久久影视免费观看| 国产传媒在线| 亚洲精品短视频| 波多野结衣中文在线| 91精品国产欧美一区二区| 国产三级电影在线| 一本大道综合伊人精品热热| 免费yellow网站| 国产精品国产三级国产aⅴ入口| 国产成人无码一二三区视频| 成人av网站在线观看免费| 日日噜噜夜夜狠狠久久丁香五月| 青青草成人在线观看| 精品中文字幕一区| 亚洲黄色视屏| 精品久久久久久综合日本| 精品电影一区| 精品无人区一区二区三区竹菊| 欧美久久一级| 精品国产_亚洲人成在线| 国产精品一卡| 日韩中文字幕一区二区| 日本亚洲欧美天堂免费| 日韩一区不卡| 国产老女人精品毛片久久| 在线成人性视频| 成人久久18免费网站麻豆 | 国产精品黄色影片导航在线观看| 久久悠悠精品综合网| 国产suv精品一区二区| 国内黄色精品| 国产精品区二区三区日本| 久久精品观看| 国产 国语对白 露脸| 91蜜桃网址入口| 国产夫妻视频| 欧美色网一区二区| 丝袜老师在线| 国内自拍欧美激情| 国产精品二区影院| 亚洲欧洲精品在线| 久久亚洲精华国产精华液| 天天噜天天色| 欧美一级高清片在线观看| 欧美日韩在线观看首页| 欧美激情一区二区久久久| 网红女主播少妇精品视频| 999热视频| 国产一区二区在线电影| 色噜噜狠狠一区二区| 欧美视频一区二区三区四区| 高清av不卡| 国产精品久久久久999| 久久av在线| 五月婷婷之综合激情| 在线观看免费视频综合| 成人在线黄色| 91免费高清视频| 国产在线乱码一区二区三区| 黑巨人与欧美精品一区| 91麻豆精品91久久久久同性| 国产精品视频一区视频二区 | 欧美精品尤物在线| 久久久久久久一区| h视频在线免费| 久久久精品国产亚洲| 亚洲色图国产| 免费毛片网站在线观看| 色综合久久99| 精品国产不卡一区二区| 国产美女精品在线观看| 欧美国产一区视频在线观看| 国产在线69| 国产精品99蜜臀久久不卡二区| 久久精品国内一区二区三区| 三上悠亚在线观看| 久久精品国产91精品亚洲| 欧美激情第10页| 欧美丰满熟妇xxxxx| 精品精品国产高清a毛片牛牛| 精品视频黄色| 国产日韩一区二区在线观看| 日韩一区二区免费在线电影 | 91av视频在线免费观看| 看电视剧不卡顿的网站| 飘雪影视在线观看免费观看 | 五月天久久狠狠| 亚洲免费观看高清完整版在线观看熊 | 久久精品国产一区二区三区日韩| 91毛片在线观看| 97影院秋霞午夜在线观看| 日本高清不卡在线| 成人毛片视频在线观看| 亚洲综合伊人久久大杳蕉| 91免费高清视频| 亚洲啪啪综合av一区二区三区| 国产欧美自拍| 一区二区在线不卡| 欧美三级午夜理伦三级中视频| 国产欧美日韩视频在线| 欧美一级黄色影院| 这里只有精品视频| 国产一区二区三区久久久| 羞羞网站在线看| 精品欧美日韩| 在线观看欧美黄色| 中文在线播放一区二区| 18成人免费观看视频漫画| www欧美日韩| 粉嫩一区二区三区在线看| 亚洲卡一卡二| 国产亚洲一区在线播放| 91久久国产综合久久| 亚洲精品小说| 三区在线视频| 91九色单男在线观看| 亚洲国产日韩a在线播放性色| 日韩在线影视| 国产精品视频一区二区图片| 国内精品久久久久影院 日本资源| 2024国产精品| 欧美国产亚洲精品| 中文字幕视频在线免费观看| 久久久久久久久久久免费 | 一区二区三区日韩| 国产精品99久久免费观看| 欧美日韩亚洲第一| xxx成人少妇69| 不卡免费追剧大全电视剧网站| 新版的欧美在线视频| 国产四区在线观看| 国产亚洲欧美一区| 99久久婷婷国产| 成人午夜大片| 粉嫩tv在线播放| 国产a一区二区| 欧美一区二区不卡视频| 热久久国产精品| 国产超碰精品| 97国产在线播放| 午夜免费日韩视频| 亚洲一区二三区| 亚洲精品小说| 午夜dj在线观看高清视频完整版| 先锋影音网一区| 中文字幕av一区中文字幕天堂| 久久综合九色欧美综合狠狠| 日韩精品丝袜美腿| 成人h小游戏| 久久久久久久久影视| 伦理中文字幕亚洲| 亚洲精品一卡二卡| 一区二区毛片| 福利一区二区三区视频在线观看| 91日韩视频在线观看| 国产精品久久久久久搜索| 欧美午夜视频在线观看| 可以看av的网站久久看| 欧洲亚洲精品久久久久| 国产视频资源| 免费精品视频一区二区三区| 中文字幕欧美国内| 亚洲精品视频免费观看| 国产欧美一级| 日韩黄色三级在线观看| 免费福利影院| 日本一区二区免费看| 亚洲网站在线观看| 亚洲制服丝袜av| 日韩精品1区2区3区| 国产一区二区| 国产区在线视频| 18禁裸男晨勃露j毛免费观看| 热99精品里视频精品| 9191国产精品| 91麻豆国产福利在线观看| 欧美丝袜丝交足nylons172| 性直播体位视频在线观看| 亚洲中文字幕无码不卡电影| 91久久精品国产91久久性色| 亚洲色图在线观看| 亚洲国产精品视频| 国产成人亚洲精品青草天美| 日本一本不卡| 日本综合视频| 国产色a在线| 五月婷婷狠狠操| 手机在线观看国产精品| 97超级碰碰碰久久久| 亚洲精品乱码久久久久久金桔影视| 亚洲精品视频观看| 99久久免费精品高清特色大片| 野花国产精品入口| 亚洲美女久久|