-2

MySQLテーブルから情報を要求するPHPスクリプトを作成しました。正しい場合は何かを実行しますが、正しくない行が多数あるため、このスクリプトは非常に低速です。スクリプトは次のとおりです。

$everypost = mysql_query("SELECT MAX(asd) FROM asd;");
$everypost = mysql_fetch_array($everypost);
$id = $everypost[0];
while ($id > 0 && $i < $var2) {
    $id = $id - 1;
    $tulajid = $context['user']['id'];
    $posts = mysql_query("SELECT * FROM asd WHERE asd='$id' AND owner='$var' GROUP BY(asd);");
    $prow = mysql_fetch_array($posts);
    if(isset($prow['asd'])) {//If it's correct, so the user is the owner
        $i++;
    }
}

私の問題は、ユーザーの投稿だけでなく、すべての投稿をチェックすることです。それをより速くするためのいくつかの解決策はありますか?$ postsクエリから削除するAND owner ='$var'と、非常に高速になります。

CREATE TABLE `asd` ( 
  `asd` int(10) unsigned NOT NULL, 
  `id_member` mediumint(8) unsigned NOT NULL, 
  `score` smallint(2) NOT NULL, 
  `owner` mediumint(8) unsigned NOT NULL, 
  `log_time` int(10) unsigned NOT NULL, 
  PRIMARY KEY (`id_msg`,`id_member`), 
  KEY id_member (`id_member`), 
  KEY owner (`owner`), 
  KEY owner_2 (`owner`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1

溶けた

4

3 に答える 3

2

つまり、データベース設計を確認する必要があります。ownerあなたはおそらくあなたのコラムにインデックスを持っていないので、必要です。

参考までに、新しいコードで関数を使用しないでくださいmysql_*。それらはもはや維持されておらず、公式に非推奨になっています。赤いボックスが表示されますか?代わりにプリペアドステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事はどちらを決定するのに役立ちます。PDOを選択した場合は、ここに優れたチュートリアルがあります。

于 2013-03-02T18:21:03.213 に答える
0

ここでの主な問題は必ずしもDBの設計ではなく、情報のクエリを行う方法だと思います。1つのクエリで最新のものをプルすると、ループダウンして、ループの反復ごとにクエリを発行します。そのサー、非常識です。正しい条件を使用することで、より少ないクエリでこれを行うことができます。

スキーマからの詳細情報がなければ、次のようなことができると思います。

SELECT a.* FROM asd a WHERE a.owner = ? ORDER BY a.asd DESC

asdこれにより、が特定の値であるタプルのすべてのインスタンスが取得されowner(を自分の値に置き換えます) 、最高から最低?の順に並べられます。asdそれがあなたが望むものであるかどうかはわかりません、そしてあなたがPHPのテーブルと変数についてのより多くの情報を投稿することができれば私はおそらくあなたにもっと良い答えを与えることができます、しかしあなたが取得しようとしているデータに関係なくあなたはたくさんあるとかなり確信していますあなたが今していることよりもそれをするより効率的な方法。

于 2013-03-02T18:25:42.640 に答える
0

まだ遅いです。id_msg=asdおよびid_poster=所有者。

于 2013-03-03T14:24:39.313 に答える