ホームページ >データベース >mysql チュートリアル >数百万データ下での MySQL 条件付きクエリとページング クエリの注意事項

数百万データ下での MySQL 条件付きクエリとページング クエリの注意事項

藏色散人
藏色散人転載
2019-04-17 17:53:083681ブラウズ

前のセクション「数百万のデータに関する mysql ページングの問題 」から続けて、次のクエリ条件を追加します。

select id from news 
where cate = 1
order by id desc 
limit 500000 ,10 
查询时间 20 秒

なんと恐ろしい速度でしょう。 !最初のセクション「数百万のデータ MySQL データ テスト環境の概要 」の知識を使用して最適化します。

select * from news
where cate = 1 and id > (select id from news where cate = 1 order by id desc limit 500000,1 ) 
order by id desc 
limit 0,10 
查询时间 15 秒

最適化の効果は明ら​​かではありませんが、条件の影響は次のとおりです。まだ素晴らしい!この場合、SQL文をいくら最適化しても業務効率の問題は解決できません。そこで、考え方を変えて、記事の ID と分類情報だけを記録するインデックス テーブルを作成し、大きな記事コンテンツをいくつかの部分に分割します。

表 news2 [ 文章表 引擎 myisam 字符集 utf-8 ]
-------------------------------------------------
idint11主键自动增加
cateint11索引

データの書き込み時に 2 つのテーブルを同期します。クエリを実行する場合は、news2 を使用して条件付きクエリを実行できます:

select * from news
where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) 
order by id desc 
limit 0,10

条件 ID > は後ほど news2 テーブルで使用されることに注意してください。

実行時間は 1.23 秒で、実行時間が 20 倍近く短縮されていることがわかります。 !データが 100,000 件程度の場合、クエリ時間は 0.5 秒程度に抑えることができ、徐々に許容できる値に近づきます。

しかし、1 秒は依然としてサーバーにとって許容できない値です。 !他に最適化できるものはありますか? ?素晴らしい変更を試みました:

news2 のストレージ エンジンを innodb に変更しました。実行結果は驚くべきものでした。

select * from news
where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) 
order by id desc 
limit 0,10

所要時間はわずか 0.2 秒で、非常に高速です。なぜこれほど大きな違いがあるのでしょうか? mysql ストレージ エンジンの詳細な説明については、次の記事をご覧ください。

以上が数百万データ下での MySQL 条件付きクエリとページング クエリの注意事項の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はhcoder.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。