搜尋
首頁後端開發php教程記一次MYSQL更新優化

引言

今天(August 5, 2015 5:34 PM)在給數據庫中一張表的結構做一次調整,添加了幾個字段,後面對之前的數據進行刷新,刷新的內容是:對其中的一個已有欄位url進行匹配,然後更新新加的欄位typetypeid。後來我寫了個shell腳本來刷數據,結果運行shell腳本後我就懵了,怎麼這麼慢~~~

情景再現

<code>CREATE TABLE `fuckSpeed` (
  `uin` bigint(20) unsigned NOT NULL DEFAULT 0,
  `id` int(11) unsigned NOT NULL DEFAULT 0,
  `url` varchar(255) NOT NULL DEFAULT '',
  `type` int(11) unsigned NOT NULL DEFAULT 0,
  `typeid` varchar(64) NOT NULL DEFAULT '',
  ......
  KEY `uin_id` (`uin`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code>

表結構大概是上面這樣的(省略了好多字段),表中只有一個聯合索引uin_id,而我在更新的時候是下面的思路:

  • 首先根據一個id範圍獲取到一定數量的數據
    select id,url from funkSpeed where id>=101 and id
  • 遍歷所有的數據,對每一條數據進行更新
    #首先對數據進行處理,匹配獲取type和typeid
    update fuckSpeed set type=[type],typeid=[typeid] where id=[id]
    按照上面的思路搞了之後,發現更新特別的慢,平均每秒鐘3~5個左右,我也是醉了,我看看要更新的數據,總共有32w+條,這樣更新下來大概需要24h+,也就是1天還要多,額~~哭了,想想一定是哪裡出問題了。

發現問題

首先我想到的是不是因為只有一個進程在更新,導致很慢,我啟動了5個進程,將id分段了,就像下面這樣

<code>./update_url.sh 0 10000 &
./update_url.sh 10000 20001 &
./update_url.sh 20001 30001 &
./update_url.sh 30002 40002 &
./update_url.sh 40003 50003 &</code>

運行之後發現還是那樣,速度沒有提升多少,還是每秒鐘更新3~5個左右,想想也是啊,時間不可能花費在插入資料之前的那些步驟(匹配、組裝sql語句、。。。),應該是插入的時候有問題

再來看看我的sql語句select id,url from funkSpeed where id>=101 and id,這裡,試著在命令列執行了下,結果如下

<code>mysql> select id,url from funkSpeed where id>=0 and id</code>

竟然花了0.18秒,這時候我猜恍然大悟,聯合索引我沒有使用到,聯合索引生效的條件是--必須要有左邊的字段,用explain驗證下,果然是這樣:

<code>mysql> explain id,url from funkSpeed where id>=0 and id</code>

然後使用聯合索引:

<code>mysql> select uin,id from funkSpeed where uin=10023 and id=162;
+------------+----------+
| uin        |   id     |
+------------+----------+
| 10023      | 162      |
+------------+----------+
1 row in set (0.00 sec)

mysql> explain select uin,id from funkSpeed where uin=10023 and id=162;
+-------------+------+---------------+----------+---------+-------------+------+-------------+
| table       | type | possible_keys | key      | key_len | ref         | rows | Extra       |
+-------------+------+---------------+----------+---------+-------------+------+-------------+
| funkSpeed   | ref  | uin_id        | uin_id   | 12      | const,const |    4 | Using index |
+-------------+------+---------------+----------+---------+-------------+------+-------------+
1 row in set (0.00 sec)</code>

可以看到幾乎是秒查,這個時候基本上可以斷定問題是出現在索引這個地方了

我select的時候次數比較少,每兩個select之間id相差10000,所以這裡可以忽略掉,而且這裡沒辦法優化,除非在id上面加上索引。

問題發生在update fuckSpeed set type=[type],typeid=[typeid] where id=[id],這裡在更新的時候也是會用到查詢的,我的mysql版本是5.5,不能explain update,不然肯定可以驗證我所說的,這裡要更新32w+條數據,每條數據都會去更新,每條數據0.2s左右,這太嚇人了~~

解決問題

問題找到了,解決起來就容易多了~~

select的時候加了一個字段uin,改為下面這樣select uin,id,url from funkSpeed where id>=101 and id,然後更新的時候使用<code>update fuckSpeed set type=[type],typeid=[typeid] where uin=[uin] id=[id],這樣一來索引就是用上了。

三下五除二改好了程式碼,試著啟動了一個進程,看看效果如何,果然,效果提升的不是一點點,平均30+次/s,這樣大概3個小時左右就可以完成所有的更新了。

微訊號: love_skills

越努力,越幸運!越幸運,越努力!

做上CEO不是夢

贏取白富美不是夢

屌絲逆襲不是夢

就是現在! !加油
記一次MYSQL更新優化

以上就介紹了記一次MYSQL更新優化,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
高流量網站的PHP性能調整高流量網站的PHP性能調整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依賴注入:初學者的代碼示例PHP中的依賴注入:初學者的代碼示例May 14, 2025 am 12:08 AM

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

PHP性能:是否可以優化應用程序?PHP性能:是否可以優化應用程序?May 14, 2025 am 12:04 AM

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

PHP性能優化:最終指南PHP性能優化:最終指南May 14, 2025 am 12:02 AM

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

PHP依賴注入容器:快速啟動PHP依賴注入容器:快速啟動May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依賴注入與服務定位器PHP中的依賴注入與服務定位器May 13, 2025 am 12:10 AM

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

PHP性能優化策略。PHP性能優化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP電子郵件驗證:確保正確發送電子郵件PHP電子郵件驗證:確保正確發送電子郵件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!