0

多次元の値の配列、特に2つのテーブルをデータベースに挿入する最良の方法を考えていますか?すべてのレコードを1つのテーブルに挿入するクエリを作成する次のforeachループを作成しました。

foreach($newPosts as $value) {
            if(!isset($postQuery)) {
                $postQuery = "INSERT INTO posts (primay_key, col1, col2, col3, col4) VALUES ('$value[0]', FROM_UNIXTIME($value[4]), '$value[2]', '$value[1]', '$value[3]')";
            } else {
                $postQuery .= "('$value[0]', FROM_UNIXTIME($value[4]), '$value[2]', '$value[1]', '$value[3]')";
            }
    }

値が特に大きく、行がLongtextとしてフォーマットされているため、値の1つを別のテーブルに格納したいと思います。この値は、データベースを照会するときにもめったに呼び出されません。それを2番目のテーブルに移動すると、最初のテーブルのクエリ速度が上がると思いますか?あれは正しいですか?

この値を2番目のテーブルに移動する場合、自動インクリメント値である最初のテーブルのprimary_keyとテーブルをリンクします。最初のテーブルのprimary_keyを2番目のテーブルに挿入しながら、この多次元配列をループして両方のテーブルにデータを挿入するにはどうすればよいですか?各クエリを一度に1つずつ実行する場合は、LAST_INSERT_ID()を使用できることを知っています。ただし、一部の更新では数百行が挿入されるため、これは実行したくありません。

前もって感謝します!

4

1 に答える 1

0

それを2番目のテーブルに移動すると、最初のテーブルのクエリ速度が上がると思いますか?あれは正しいですか?

必ずしも。パフォーマンスにのみ影響します

  • 大きな列にインデックスが付けられている場合(MySQLがインデックス付きフィールドのサイズを制限しているため、これはほとんどありません)
  • クエリが定期的に全表スキャンを実行する場合
  • ケースの大部分(約3分の1以上)で値がnullの場合

あなたが言うように、あなたはそれを2つのテーブルに分割することによってマルチインサートの利点を失います。したがって、あなたが提案するように、あなたの唯一のオプションは、一度に1つのレコードを挿入し、挿入IDを読み戻すか、(コードが複雑な場合は)シーケンスジェネレーターを使用して複数のレコードIDを事前に割り当てることです。

于 2012-04-13T08:54:03.533 に答える