ヒットとトラフィックでかなりハードハンマーになる可能性のあるシステムを構築する。これは典型的なApache/PHP/MySql設定です。
これまでに多くのシステムを構築したことがありますが、このサイズの潜在的なスケーラビリティーについて私が本当に決定しなければならないシナリオはありませんでした。この規模のシステムを構築することについては何十もの質問がありますが、この特定の質問については、データ型として何を使用するかを決定しようとしています。
これは100フィートのビューです:
(特に)descriptionフィールドを持つテーブルがあります。 255文字に制限することにしました。それは検索可能になります(ie:...を含む説明を持つすべてのエントリを表示します)。問題:このテーブルには、ある時点で数百万のエントリに数百万が含まれる可能性があります(またはそう考える)。
私はまだ検索の戦略を理解していません(MySql LIKE演算子は低速である可能性が高いか、このような大きな#レコードに対して私が推測している)もう1つSO =質問。この質問についてはこのフィールドをtinytext、varchar、charとして作成することの賛否両論と思います。
私はデータベースエキスパートではありませんので、すべてのコメントが役に立ちます。ありがとう-
CHAR
を使用します。
BLOB
とTEXT
は行の外に格納されるため、それらを読み取るとアクセスペナルティが発生します。 VARCHAR
は可変長であり、(行がすべて固定長ではないため)小さなアクセスペナルティが発生する可能性があるため、ストレージスペースを節約できます。
ただし、インデックスを適切に作成すれば、VARCHAR
またはCHAR
を完全にインデックスに格納できるため、アクセスが大幅に高速化されます。
参照: varchar(255)v tinyblob v tinytext
そして: http://213.136.52.31/mysql/54
そして: http://forums.mysql.com/read.php?10,254231,254231#msg-254231
そして: http://forums.mysql.com/read.php?20,223006,223683#msg-22368
ちなみに、私の経験では、MySQL regex
演算子は、単純なクエリの場合、LIKE
よりもはるかに高速です(つまり、SELECT ID WHERE SOME_COLUMN REGEX 'search.*'
)、そして明らかにより用途が広い。
あなたの状況では、LIKE
(a LIKE '%string%'
は、そのタイプに関係なく、その列に作成されたインデックスを使用しません)。それ以外はすべて単なるノイズです。
TINYTEXT
とVARCHAR
の最大差が255文字であることに大きな違いはありません。また、CHAR
は可変長文字列用ではありません。
だから私の提案:VARCHAR
またはTINYTEXT
(私はVARCHARを個人的に使います)を選択し、Lucene、Sphinxなどの全文検索エンジンを使用してその列のコンテンツにインデックスを付けます。あなたのための仕事。 LIKE
のことを忘れてください(たとえそれが、何らかの理由で自分でフルテキスト検索インデックスエンジンをカスタムビルドする必要があることを意味する場合でも、つまり、他のエンジンでは満足できない一連の機能のサポートが必要です) 。
Varcharを使用すると、低レベルで実際のデータベースに可変長が格納されるため、ディスク領域を節約でき、行がすべてを使用しない場合でも、テキストフィールドは固定長になります。固定長の文字列は、クエリを高速化する必要があります。
編集:調べたところ、テキストタイプも可変長で保存されています。 mysqlslapのようなものでベンチマークするのが最善の方法です
他の未確認の質問に関しては、おそらく、説明フィールド内のすべての有用なWordを個別に説明に関連付ける何らかの検索インデックスを作成する必要があります。その場合、そのインデックスを作成して、代わりに検索できます。 %like%を使用するよりもはるかに高速になります。
数百万の行を検索する場合は、これらのテキストをすべて別のテーブルに保存し(大きなテーブルの行サイズを小さくします)、テキストデータが短い場合はVARCHAR
を使用し、必要な場合はTEXTを使用します長さ。
LIKE
で検索する代わりに、Lucene、Sphinx、Solrなどの特殊なソリューションを使用します。どちらを覚えているかはわかりませんが、少なくとも1つはリアルタイムまたはほぼリアルタイムのインデックス作成用に簡単に構成できます。
[〜#〜]編集[〜#〜]
テキストを別のテーブルに保存するという私の提案は、IOメインテーブルに必要)を減らしますが、データが挿入されると、追加のインデックスを保持する必要があり、selectに結合オーバーヘッドを追加するため、を使用する場合にのみ有効ですいくつかの説明を一度に読み取るためのテーブルと、テーブルからの他のデータがより頻繁に使用されます。