0

誰も答えていない別の質問に関連しています。

誰かが私を助けてくれる前に別の質問をしましたが、今は別の状況で立ち往生しています。

さて、2列のような2つの別々のエンジンから使用し、 myisamエンジンをuid持ち、タイムスタンプであるメモリエンジンを使用しているテーブルに何らかの方法があるかどうか知りたいです。usernamelastlogin

私はそれが不可能だと思ったので、データベースにオンラインユーザー(MEMORY ENGINE)という2つの列を持つテーブルを作成しようとしました。ユーザーがログインしたいときは、このようにデータベースをチェックし、ユーザーが存在しない場合は挿入しuidますlastlogin

$myquery = mysql_query('SELECT COUNT(1) FROM `onlineusers` WHERE uid="'. $row['uid'] . '"');

if(mysql_result($myquery,0) == 0){
    $data['uid'] = $row['uid'];             
    $db->insert("onlineusers",$data);
}else{
    updateStatus($row['uid']);
}

更新ステータス機能は次のようなものです

function updateStatus($uid){
    $db = DATABASE::obtain();
    $query = mysql_query("UPDATE `onlineusers` set `lastvisit`=now() WHERE uid='".$db->escape($uid)."'");
}

しかし、これについて考えてみると、サーバーを再起動すると、onlineusers のテーブルが空になり、ログインしている Cookie が設定されているユーザーはどうなるでしょうか?

次に、2 つの個別のクエリを使用するように更新関数を変更する必要があります。最初のクエリでは、uid が onlineuses に存在するかどうかを確認し、存在しない場合はそれに挿入するか、存在する場合はタイムスタンプを更新する必要があります。

今、私は尋ねるべき別の質問があります. このメソッドを使用すると、存在するかどうかを確認してから、メモリエンジンを持つ updatestatus 関数で更新する方が高速です...または、ユーザーテーブルにタイムスタンプクローンを作成し、myisam エンジンを持つ各ページチェックで更新しますか??

4

1 に答える 1

0

あなたがやろうとしていること、つまり、同じテーブルで 2 つの別々のエンジンを使用することは不可能に思えます。MySQL の最も基本的なレベルとして、単一のエンジンが単一のテーブルを制御します。それを回避することは可能かもしれませんが、賢明ではありません。ソースを編集することはできますが、それはクレイジーです。パフォーマンスが心配な場合は、テーブルを複数のテーブルに分割して、必要なテーブルで必要なエンジンを使用することができます。それ以外の場合は、必要に応じてキャッシングを介してパフォーマンスを向上させる mem キャッシュ (これをお勧めします) などのキャッシング フレームワークを使用できます。Mem キャッシュは十分にテストされた PHP ツールであり、必要なもののように思えます。幸運を。

于 2012-11-02T19:59:04.403 に答える