あなたのクエリに従って、最適化を考える必要がある場合は、いくつかのケースを検討します
ケース 1:
あなたが言及したように、60 (リンク) * 5 (カテゴリ) になると、これらは mysql 側自体から処理するのが非常に簡単です。SQL テクニック自体をうまく利用して、その利点を得ることができます。
常に PHP 処理 + SQL を混在させることができます。PHP の処理速度は mysql よりも高速です。そう、それをつかむ。
あなたのクエリはSQlだけでも解決でき、paoloが言及したクエリは簡単に使用できます。
ケース 2:
テーブル参加テーブルの一方または両方のレコード数が多すぎる状況があります。それらの間に結合がある場合、多数の組み合わせ、つまり結合サイズが発生します。例: リンク (100000) * カテゴリ (10) = 100 万 これらの場合、結合を避けることができます。
インデックスを活用できます。インデックスは、特定の列の値を持つ行をすばやく見つけるために使用されます。インデックスがない場合、MySQL は最初の行から始めて、テーブル全体を読み取って関連する行を見つける必要があります。
フラット ファイル、つまり、結合の概念を使用しない MongoDB のようなスキーマ フリー データベースのような手法がありますが、巨大なサイトで実行することを計画している場合 (巨大なため、ホストするために多くのサーバーが必要になることを意味します)
MySQl は適切にスケーリングされ、huuuuuuuuge 環境にいるときは、MySQl から何かを考える必要があります。
ここでは、結合と依存クエリを使用せずにクエリを解決しました。私は結果をフェッチし、より高速な配列マッピング手法のみを使用しました。
$query = mysql_query("SELECT * FROM category order by `order` asc");
while($row = mysql_fetch_assoc($query) ) {
$categories[$row['id']]['cat'] = $row['cat'];
$categories[$row['id']]['order'] = $row['order'];
}
$query = mysql_query("SELECT * FROM links ORDER BY `order` ASC ");
$count =0;
while($row = mysql_fetch_assoc($query) ) {
$links[$row['cat-id']][$count]['link'] = $row['link'];
$links[$row['cat-id']][$count]['order'] = $row['order'];
$links[$row['cat-id']][$count]['cat-id'] = $row['cat-id'];
$count++;
}
foreach ($categories as $id=$value) {
foreach ($links[$id] as $link_info) {
if ($last_cat != $link_info['cat-id'])
print '<h3' . $categories[$link_info['cat-id']]['cat'] . '</h3';
print $link_info['link'] . '<br';
$last_cat = $link_info['cat-id'];
} }