MYSQL の更新と最適化を忘れないでください。
はじめに
今日 (2015 年 8 月 5 日 5:34 PM) データベース内のテーブルの構造を調整し、いくつかのフィールドを追加して、以前のデータを更新しました。 更新の内容は次のとおりです。 既存のデータと一致する。フィールド url
を追加し、新しく追加されたフィールド type
と typeid
を更新します。その後、データを更新するためにシェル スクリプトを作成しました。シェル スクリプトを実行した後、ジョイント インデックス uin_id
が 1 つしかないのに、それを更新したときに混乱しました。次のアイデアがありました: url
进行匹配,然后更新新加的字段type
和typeid
。后来就写了个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<=200; - 遍历所有的数据,对每一条数据进行更新
#首先对数据进行处理,匹配获取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<=200;
,这里,试着在命令行执行了下,结果如下
<code>mysql> select id,url from funkSpeed where id>=0 and id<=200; Empty set (0.18 sec)</code>
竟然花了0.18秒,这个时候我猜恍然大悟,联合索引我没有使用到,联合索引生效的条件是——必须要有左边的字段,用explain验证下,果然是这样:
<code>mysql> explain id,url from funkSpeed where id>=0 and id<=200; +-------------+------+---------------+------+---------+------+--------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------------+------+---------------+------+---------+------+--------+-------------+ | funkSpeed | ALL | NULL | NULL | NULL | NULL | 324746 | Using where | +-------------+------+---------------+------+---------+------+--------+-------------+ 1 row in set (0.00 sec)</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)<p>可以看到几乎是秒查,这个时候基本可以断定问题是出现在索引这个地方了</p> <p>我select的时候次数比较少,每两个select之间id相差10000,所以这里可以忽略掉,而且这里没办法优化,除非在id上面添加索引。</p> <p>问题发生在<code>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<=200;
,然后更新的时候使用update fuckSpeed set type=[type],typeid=[typeid] where uin=[uin] id=[id]
- まず、ID 範囲に基づいて一定量のデータを取得します id>=101 および id<=200;である funkSpeed から id,url を選択します
- すべてのデータを走査し、各データを更新します #最初にデータを処理し、type と typeid を照合して取得します
update funkSpeed set type=[type ], typeid=[typeid] where id=[id]
上記の考えに従った後、更新されるデータは合計 320,000 件以上あり、平均して 1 秒あたり約 3 ~ 5 件であることがわかりました。 、更新には24時間以上かかります、つまり1日以上かかります、う〜〜、考えてみれば何か問題があるはずです。
問題が見つかりました最初に考えたのは、更新が 1 つしかないため非常に遅くなるのではないかということで、5 つのプロセスを起動して ID をセグメント化しました。このようにこの問題は、rrreee
実行してみると、速度はあまり改善されておらず、依然として 1 秒あたり 3 ~ 5 回の更新が行われています。考えてみれば、挿入前の手順に時間を費やすことはできません。データ (SQL ステートメントの照合、アセンブルなど) を挿入するときに問題が発生するはずです私の SQL ステートメントを見てみましょう。select id,url from funkSpeed where id>=101 and id<= 200;
、ここでコマンドラインで実行してみます しばらくすると結果は以下の通りrrreee
実際には0.18秒かかったのですが、この時ふと気づいたのでしょう。ジョイントインデックスが有効になる条件は、左側にフィールドがある必要があることです。ほぼ 2 回目の検索であることがわかります。この時点で、基本的にインデックスに問題が発生していると判断できます。
を選択すると、回数は比較的少なく、それぞれの 2 つの ID が選択されます。差は 10,000 であるため、ここでは無視できます。ID にインデックスを追加しない限り、最適化する方法はありません。
update funkSpeed set type=[type],typeid=[typeid] where id=[id]
で発生します。私の mysql バージョンは 5.5 です。 更新を説明できません
。そうでない場合は、ここで更新するデータが 320,000 以上あり、各データの更新には約 2 秒かかります。これは怖すぎます~~問題を解決してください 問題が見つかったら、解決するのはずっと簡単になります~~🎜🎜 選択時にフィールド
uin
が追加され、次のように変更されましたselect uin,id,url from funkSpeed where id>=101 and id<=200;
, then use update funkSpeed set type=[type],typeid=[typeid] where uin =[uin] id=[id] となり、インデックスが使用されます。 🎜🎜 コードを 3 回、5 回、2 回変更した後、効果を確認するためにプロセスを開始しようとしましたが、結果は平均 30 回以上でした。 、すべて3時間程度で完了できるようになりました。 🎜🎜WeChat ID: love_skills🎜🎜🎜一生懸命働けば働くほど、あなたはもっと幸運になります!幸運であればあるほど、一生懸命働くことになります。 🎜🎜CEOになることも夢じゃない🎜🎜バイ・フメイに勝つことも夢ではない🎜🎜ディシの反撃も夢ではない🎜🎜今だ! !さあ🎜🎜🎜🎜
🎜
上記は、内容の側面も含めて MYSQL アップデートの最適化について紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜
🎜
🎜

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Windows 11/10 のイベント ビューアーでイベント ID 55、50、140、または 98 が表示された場合、またはディスク ファイル システム構造が破損しているため使用できないというエラーが発生した場合は、次のガイドに従って問題を解決してください。イベント 55、ディスク上のファイル システム構造が壊れていて使用できないとはどういう意味ですか?セッション 55 では、Ntfs ディスク上のファイル システム構造が破損しており、使用できません。ボリューム上で chkMSK ユーティリティを実行してください。NTFS がトランザクション ログにデータを書き込むことができない場合、イベント ID 55 のエラーがトリガーされ、NTFS はトランザクション データを書き込むことができず操作を完了できません。このエラーは通常、ディスク上に不良セクタが存在するか、ディスク サブシステムのファイル システムが不十分なために、ファイル システムが破損した場合に発生します。

AppleIDを使用してiTunesStoreにログインすると、「このAppleIDはiTunesStoreで使用されていません」というエラーが画面に表示される場合があります。心配するようなエラー メッセージはありません。これらのソリューション セットに従って問題を修正できます。解決策 1 – 配送先住所を変更する iTunes Store にこのプロンプトが表示される主な理由は、AppleID プロファイルに正しい住所がないことです。ステップ 1 – まず、iPhone で iPhone 設定を開きます。ステップ 2 – AppleID は他のすべての設定の最上位にある必要があります。それで、開けてください。ステップ 3 – そこに到達したら、「支払いと配送」オプションを開きます。ステップ 4 – Face ID を使用してアクセスを確認します。ステップ

Alibaba ソフトウェアでは、アカウントの登録が完了すると、システムによって一意の ID が割り当てられ、これがプラットフォーム上での ID として機能します。しかし、多くのユーザーは自分の ID を照会したいと考えていますが、その方法がわかりません。次に、この Web サイトの編集者が以下の戦略手順を詳しく紹介します。お役に立てれば幸いです。 Alibaba ID: [Alibaba]-[My] に対する答えはどこで見つかりますか。 1. まず Alibaba ソフトウェアを開きます. ホームページに入ったら、右下隅の [My] をクリックする必要があります; 2. その後、My ページにアクセスすると、ページの上部に [id] が表示されます; Alibaba ID はタオバオと同じですか? アリババ ID とタオバオ ID は異なりますが、この 2 つは同じです
![イベント ID 4660: オブジェクトが削除されました [修正]](https://img.php.cn/upload/article/000/887/227/168834320512143.png?x-oss-process=image/resize,m_fill,h_207,w_330)
一部の読者がイベント ID4660 に遭遇しました。何をすればよいかわからないことが多いため、このガイドで説明します。イベント ID 4660 は通常、オブジェクトが削除されたときにログに記録されるため、コンピューター上でイベント ID 4660 を修正する実際的な方法も検討します。イベントID4660とは何ですか?イベント ID 4660 は Active Directory 内のオブジェクトに関連しており、次のいずれかの要因によってトリガーされます。 オブジェクトの削除 – オブジェクトが Active Directory から削除されるたびに、イベント ID 4660 のセキュリティ イベントがログに記録されます。手動変更 – ユーザーまたは管理者がオブジェクトのアクセス許可を手動で変更すると、イベント ID 4660 が生成される場合があります。これは、権限設定の変更、アクセス レベルの変更、またはユーザーやグループの追加または削除を行うときに発生する可能性があります。

Tencent Video ID はどこで確認できますか? Tencent Video APP には専用の ID がありますが、ほとんどのユーザーは Tencent Video ID を確認する方法を知りません。次は、Tencent Video ID を確認する方法についてのグラフィック チュートリアルです。興味のあるユーザーはぜひ見に来てください! Tencent Video 使用チュートリアル Tencent Video ID を確認する場所 1. まず Tencent Video APP を開き、メイン ページの右下隅にある [パーソナル センター] から特別エリアに入ります; 2. 次に、パーソナル センター ページに入り、[設定]機能; 3. 次に、設定ページに移動し、下部の[アカウントを終了]をクリックします; 4. 最後に、以下のページで専用のID番号が表示されます。

getElementById が "created()" フック関数で使用されており、Vue のマウントが完了していないため、Vue は id 属性を取得できません。解決策は、"created() {let serachBox = document.getElementById('searchBox') ;.. .}" コードを "mounted()" フック関数に移行できます。

golang を使用した SelectChannelsGo 同時プログラミングの非同期処理方法 はじめに: 同時プログラミングは、アプリケーションのパフォーマンスと応答性を効果的に向上させることができる、現代のソフトウェア開発における重要な領域です。 Go 言語では、Channel と Select ステートメントを使用して同時プログラミングを簡単かつ効率的に実装できます。この記事では、SelectChannelsGo 同時プログラミングの非同期処理メソッドに golang を使用する方法を紹介し、具体的な方法を提供します。

jquery で select 要素を非表示にする方法: 1. hide() メソッド。jQuery ライブラリを HTML ページに導入します。さまざまなセレクターを使用して select 要素を非表示にできます。ID セレクターは、selectId を選択した select 要素の ID に置き換えます。実際に使用する; 2. css() メソッド、ID セレクターを使用して非表示にする必要がある select 要素を選択し、css() メソッドを使用して表示属性を none に設定し、selectId を select 要素の ID に置き換えます。
