前のセクション「数百万のデータに関する 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 サイトの他の関連記事を参照してください。