既存の MySQL データベースのパフォーマンスを改善しようとしています。
これはレストランに関するデータベースで、関連するテーブルが 2 つあります。
Web サイトのすべてのエンティティのテーブルがあり、すべてのエンティティには一意の ID があり、エンティティはほとんど何でもかまいません。レストラン、ユーザー、その他多くのものです。いくつかのエンティティ タイプがあり、レストランのエンティティ タイプは「オブジェクト」です。
また、データベースのこの構造はほとんど存在しているので、大きな変更はしたくありません。たとえば、すべてのエンティティのテーブルを削除するつもりはありません。(データベース自体にはデータはありませんが、PHP エンジンが組み込まれているため、構造に大きな変更を加えることは困難です)。
オブジェクト専用のテーブルもあります。そのデータベースにはいくつかのタイプのオブジェクトがありますが、特にレストランはウェブサイトの主題であるため、多くの検索が行われます。レストランには国、都市、名前、ジャンルなどのいくつかのフィールドがあります。同じ都市と国に同じ名前のレストランが 2 つ存在することはありません (たとえば、同じ名前で同じ国の異なる都市にある 2 つのレストラン、または同じ名前であるが同じ国にある 2 つの都市に存在する可能性があります)。異なる国)
したがって、この事実から、国、都市、および名前の列に対して一意の 3 列のインデックスを作成する必要があると思います。
また、URL も www.domain.com/Country/City/Restuarant-Name の形式で作成されているため、country-city-name の組み合わせは高速にフェッチされ、このタイプのクエリが発生します。多く。
しかし、他の多くのタイプのクエリもあります: 特定の都市または特定の場所にあるレストランの名前の検索 (検索する名前がフルネームの一部である可能性があるため、LIKE クエリを使用)国。特定の国や都市にある特定のジャンルのすべてのレストランを検索します。そして可能なほとんどすべての組み合わせ。
おそらく最もよく使用されるクエリは、(a) 特定の都市と国のレストラン名を検索すること (URL を入力するときに使用されるクエリと同じですが、LIKE を使用します)、(b) ある場所のレストランを検索することです。特定の都市と国の特定のタイプ。最後に (c) グローバルにレストラン名を検索する (データベース全体で、都市と国を指定せずに)
このテーブル (オブジェクト テーブル) には現在、オブジェクトの ID である PRIMARY KEY があります。ID もよく使用されます。ベスト プラクティスは次のようになりますか?:
- 国、都市、名前から 3 列の UNIQUE インデックスを作成する
- 名前から別の(一意ではない)インデックスを作成します(そのため、上記で書いたタイプ c のクエリは高速に実行されます)
- オブジェクトテーブルからレストランのみを含むサブテーブルを作成して、このサブテーブルがクエリされるようにすることもできます。(これはそれほど重要ではありません。大きな変更を加えることにした場合、最初にオブジェクトの残りの部分からレストランを分離する可能性が高いからです)
長い間これを決定しようとしてきたので、助けていただければ幸いです。
ps オブジェクト テーブルの一部のオブジェクトにはジャンルや国や都市がないため、NULL のままになります。NULL 値が UNIQUE KEY で許可されていることはわかっていますが、パフォーマンスに影響がありますか?
この長い質問を喜んで読んでくれた人に感謝します:)