国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

MySQL データベースのクエリには一定の時(shí)間がかかります
P粉764836448
P粉764836448 2023-08-31 22:29:19
0
2
695
<p>24,000 行を含む大規(guī)模なメッセージ データベースがあります。</p> <pre class="brush:php;toolbar:false;">行 0 ~ 24 を表示します (合計(jì) 2455455 行、クエリには 0.0006 秒かかります)。 </pre> <p> メッセージがあるため、會(huì)話をより速く読み込む必要があります。會(huì)話の少ないユーザーの場(chǎng)合、読み込みは次のようになります (ユーザーの會(huì)話數(shù)は 3.2k): </p> <pre class="brush:php;toolbar:false;">行 0 ~ 24 を表示します (合計(jì) 3266 行、クエリには 0.0345 秒かかります) [id: 5009666... - 4375619...]。 </pre> <p>會(huì)話が多いユーザー (會(huì)話數(shù)が 40,000 件のユーザー) の読み込みが遅くなります: </p> <pre class="brush:php;toolbar:false;">行 0 ~ 24 を表示します (合計(jì) 40296 行、クエリには 5.1763 秒かかります) [id: 5021561... - 5015545...]。 </pre> <p>これらの列にはインデックス キーを使用します: </p> <pre class="brush:php;toolbar:false;">id、to_id、from_id、時(shí)刻、參照時(shí)間</pre> <p>データベーステーブル: </p> <pre class="brush:php;toolbar:false;">CREATE TABLE `messages` ( `id` int(255) NOT NULL、 `to_id` int(20) NOT NULL、 `from_id` int(20) NOT NULL、 「メッセージ」の長(zhǎng)いテキストは NULL ではありません、 `time` double NOT NULL、 `seen` int(2) NOT NULL、 ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO `messages` (`id`、`to_id`、`from_id`、`message`、`time`、`seen`) 値 (2、6001、2、「こんにちは」、1587581995.5222、1); ALTER TABLE `メッセージ` 主キー (`id`) を追加します。 ADD KEY `time_idx` (`time`)、 ADD KEY `from_idx` (`from_id`)、 ADD KEY `to_idx` (`to_id`)、 ADD KEY `seenx` (`seen`)、 ADD KEY `idx` (`id`); ALTER TABLE `メッセージ` MODIFY `id` int(255) NOT NULL AUTO_INCREMENT、AUTO_INCREMENT=5021570; COMMIT;</pre> <p>次のクエリを使用します: </p> <pre class="brush:php;toolbar:false;">SELECT * から メッセージ、 ( 選択する MAX(id) として lastid から メッセージ どこ ( messages.to_id = '1' -- 比較する ID (ログインしているユーザーの ID) ORmessages.from_id = '1' -- 比較する ID (ログインしているユーザーの ID) ) グループ化 CONCAT( LEAST(messages.to_id,messages.from_id), 「?!?、 GREATEST(messages.to_id,messages.from_id) ) ) 會(huì)話として どこ id = 會(huì)話.lastid 注文方法 messages.id DESC</pre> <p>データベース構(gòu)造を再作成する必要がある場(chǎng)合、會(huì)話が多いユーザーの処理を高速化する方法がわかりません。 </p>
P粉764836448
P粉764836448

全員に返信(2)
P粉710478990

うーん、テーブルにインデックスを追加してみてはいかがでしょうか: https://www.drupal.org/docs/7/guidelines-for-sql/the-benefits-of-indexing-large-mysql -tables#:~:text=インデックスの作成&text=インデックスを作成するステートメント。インデックスは個(gè)別である必要があります。 クエリを?qū)g行する行に基づいて複合インデックスを追加してください。

これによってクエリ時(shí)間が改善されない場(chǎng)合は、クエリを改善する必要があります。

P粉020085599

###知らせ:###

OR の代わりに UNION を使用します (以下を參照)
  • 冗長(zhǎng)なキーがあります。 PRIMARY KEYはキーなのでKEY(id)
  • を削除します。
  • すべての列にインデックスをやみくもに作成しないでください。代わりに、クエリを使用して、どのインデックス (特に複合インデックス) が実際に役立つかを判斷してください。
  • GROUP BY と ORDER BY では、CONCAT は不要であり、逆効果になる可能性があります。
  • INT 型の場(chǎng)合、長(zhǎng)さフィールドは無(wú)視されます。値の制限は 20 億です。 (0 か 1 しかないと仮定すると、これはやりすぎでしょうか?)
  • 新しい構(gòu)文 JOIN..ON を使用します。
  • true/false のみが表示される場(chǎng)合は、そのインデックスを削除します。 (または、役に立つと思われるクエリを見(jiàn)せてください。)
  • CONCAT-LEAST-GREATEST - これは「friends_id」を構(gòu)築するためのものですか?おそらく本當(dāng)に必要なのは「conversation_id」なのでしょうか?現(xiàn)在、2 人のユーザーが複數(shù)の「會(huì)話」を行うことはできませんよね。

必要に応じて、conversation_id の新しい列を作成します。 (現(xiàn)時(shí)點(diǎn)では、GROUP BY は非効率的です。) 次のコードにより、そのような ID が不要になります。

リーリー

そして、これらの「カバー」インデックスと「複合」インデックスを用意します:

リーリー

新しいインデックスでこれら 2 つのインデックスの他のすべてのタスクを処理できるため、KEY(to_id)、KEY(from_id) を削除します。

これは同じ効果があると思いますが、実行速度が速くなります。

それらを組み合わせる:

リーリー

(これら 2 つのインデックスを追加します)

######もっと######

私はかつて、conversation_id の必要性を UNION DISTINCT で置き換えることができると誤って考えていました。しかしそれは真実ではありません。すぐにいくつかの解決策が見(jiàn)つかりました:

conversation_id を追加し、重複排除に使用します。 (また、UNION DISTINCT を UNION ALL に変更して、結(jié)果を変えることなくクエリをわずかに高速化しました。)

(from_id、to_id、latestid) を含む一時(shí)テーブルにクエリ結(jié)果を入力し、CONCAT-LEAST-GREATEST テクニックを使用して會(huì)話を重複排除し、最後にメッセージ テーブルと JOIN して追加の列を取得します。

この一時(shí)テーブル テクノロジにより、書(shū)き込みとデバッグが容易になります。私の 3 番目の提案は、これらの部分を 3 レベルの深さでネストされた Select ステートメントを含む 1 つの (判読できない) クエリに結(jié)合することです。
最新のダウンロード
詳細(xì)>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート