mysql - SQL语句可以提供“查询表,并至第100条结果为止”吗?
PHP中文网
PHP中文网 2017-04-17 15:00:45
0
6
665

描述问题
  目前想用SQL语句来查询一个表(50万条),并将表内昵称为空的用户Openid拿出来,每百条查询一次。环境MySQL。

问题关键
  一次性取出,分百条查询,也会给服务器造成很大压力(*1),能不能让SQL查询出100条符合结果的记录,并返回最后一条的ID?

拓展
  除了我这种想法,业界有没有一个合适的方案?或者关于SQL大容量查询 的一些书籍。

*1:首先,我的服务器是小水管,50万条已经相当重了。其次,就算我现在扩展服务器配置,假设某天达到了1亿条,也会成为很大的负载压力。

表结构:
id openid nickname avatar

部分openid的nickname或avatar(头像)是空的,想要每次查出100个nickname或avatar(头像)为空的openid,并调用微信接口,将获取到的信息插入。

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(6)
洪涛

SQL クエリは結果に一致する 100 件のレコードを見つけて、最後のレコードの ID を返すことができますか?

この質問は少し変です。100 個のデータを返しますか?それとも、これら 100 個のデータのうち最後の ID を返す必要がありますか?

まず第一に、サーバーがデプロイされているマシンのパフォーマンスが非常に悪い場合を除き、500,000 個のデータは多すぎません。そのため、(非常に複雑なコードや低パフォーマンスのコードを作成しない限り) クエリ速度がそれほど遅くなる必要はありません。 SQL) を複数回取得することは確かに可能ですが、データベースの負荷は軽減されますが、ネットワークの送信負荷は増加します。

さらに、50W テーブル データのソリューションは 1E テーブル データのソリューションとは完全に異なるため、1 つのソリューションで完全に解決できると想定しないでください。

添付された SQL:

リーリー

OR が使用されているため、nicknameavatar のインデックスは必要ないと推定されます。または、レコードが完了したかどうかを示すために completed というフィールドを追加することもできます (つまり、 と nickname は空ではありません。このフィールドはプログラムがデータを挿入するときに維持されるため、クエリ SQL は avatar 接続を回避できます。 OR

いいねを押す +0
PHPzhong

現在のシナリオでは、クエリが必要なすべてのフィールドにインデックスを作成します。

いいねを押す +0
Peter_Zhu

1.インデックスは追加されましたか?
2. SQL を最適化する

500,000 データは実際には多くありません。

いいねを押す +0
PHPzhong

どのような機能を実現したいのかわかりません。100 個の項目を検索しても最後の 1 列だけを返すのは意味がありません。インデックス付きの書き込みストレージ処理を実装する必要がある場合、それはほぼ完了です。同じ 480w 行のテーブルは修飾された列をチェックし、すべての行を返します。問題は、修飾された行が多すぎて、出力時にメモリが不足している可能性があります。結果を 1 つずつ新しいテーブルに挿入すると、時間が遅くなるだけです。

いいねを押す +0
迷茫

インデックスを追加するか、定期的にデータベースをキャッシュに書き込みます

いいねを押す +0
黄舟

このようなことは退屈ですし、結果が理想的でない場合は、削除しても構いません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート