PHPでwhileでsqliteを全件取得したいのですが、 件数が多いため(3千件)、遅いです。 どのように書いたらよいのでしょうか。

補足

すみません。 3千件ではなく「3千万件」でした。 3千件なら1秒もかからないですよね。

PHP147閲覧xmlns="http://www.w3.org/2000/svg">25

ベストアンサー

0

order by id % 7 の代わりに、データ作成時に rand() を格納したカラムを使ってみましたが、それでも時間的にはほぼ同じでした。 ∴ SQLiteは10000件程度で音を上げるようなことはないですね。 10万件でも試行しましたが問題ありません。7桁のオーダーになると処理する方が(特にfetchAllだと)メモリ的に破綻するかもしれませんが、それはDBが何であっても同じですよね(テキストファイルからシーケンシャルに読み込んでも同じことなので)。

ThanksImg質問者からのお礼コメント

コードを書いていただいたので、ベストアンサーにさせていただきました。

お礼日時:9/27 5:10

その他の回答(3件)

0

「遅い」って、具体的に何秒ですか? 何秒なのかPHP使って計測してください。 普通、たった3000件で遅くなることなどありえません。 どんなデータなのかにもよりますが、普通ありえない。

そもそも「3千万件取得」という仕様や設計自体がおかしい可能性が大。 遅さが気になるということは1回きりとか、バッチ処理で深夜にやるとかじゃないですよね? 頻繁にそのクエリを投げるということですよね? それで毎回3千万件取得はおかしい。どういうアプリでどういう処理のために3千万件ものselectが発生するのか? そこからの見直しが必須です。たぶんクエリ投げる前にもっと絞り込めるし、テーブル側でもインデックス張ったり、いろいろやれることあるはず。

1

ご提示のスクリプトを、住所.jp からダウンロードした全国版データを利用して全件取り出して city_name だけ表示して時間を計測したところ、 149887 件 を 0.50255084037781 秒でした。 > 件数が多いため(3千件)、遅いです。 SQLiteそのものがそれほど遅いとは思えませんが、本当にその SQLでしょうか? そんな単純な SQLではなくて、インデックスの張られていない(あるいは利用できない)カラムを利用してるとかの、SQL上のお話だとか、 > //なんか処理 の部分が速度の上がらない処理をしているとかではありませんか?

1人がナイス!しています

> 3千件ではなく「3千万件」でした 本当に3000万件の取得が必要であるなら、それなりの時間が掛かるのは当然です。 その「当然」が耐えられないのなら、「本当に必要」であるかの再確認から始める必要ありますが、もちろんその辺りは済んでるとします。 件数が多いので、些細な事でも速度に影響します。 SQL自体の最適化は必須でしょう。 とりあえず多めに(または全件)取得しておいて、さらに PHP側でフィルタリングするよりも、SQLで書いた方が速いのではありませんか? while()よりも foreach()の方が速いはず。 __PDOStatement は Traversable なのでそのまま回せる __foreach($pdo1->query($sqlb) as $kekka) { } ループ内処理も、速度の観点で見直しが必要。 __preg系を避けるとか