WHERE
主な質問は、「節でどちらが速いint
かvarchar
?」です。あなたがここにいるべきものではありません。
まず、値が大きすぎてフィールドint
に入れる必要があります。bigint
第二に、おそらくどちらも使用したくないでしょうvarchar
が、代わりに好むでしょうchar
(文字列の長さが一定になることがわかっているため)。現在、これらの変更のいずれかを適用すると、数十万 (または数百万) のレコードに対して一度に数千のクエリを実行しない限り、パフォーマンスへの影響に気付くことはありません (特にテーブルにインデックスを付ける場合)正しく。
では、本題です。2 つの日付があり、それらを 1 つの列にマージしています。これは行うべきではありません。コメントで、Google アナリティクスからこのような値を受け取っていると述べました。ただし、値を 2 つの別個の日付値に分割し、それらを 2 つの別個の列 (両方ともdate
型) に格納できる必要があります。
varchar
あなたの質問は2つの別々のフォーマットでそれらを示しているので、あなたがどのフォーマットでそれらを受け取っているのかわかりません__
. PHP でこれにフラグを立てたので、両方の形式を 2 つの個別の変数に分割する方法を次に示します。
区切り文字付きの文字列 (yyyy-mm-dd も区切るため、非常に簡単になります):
// assuming a string with a __ delimiter
list($firstDate, $secondDate) = explode('__', $originalDate);
yyyymmdd の形式のまま、区切り記号のない文字列/整数:
// assuming a string that has no delimiters:
$firstDate = substr($originalDate, 0, 8);
$secondDate = substr($originalDate, 8);
yyyy-mm-dd 形式を強制する、区切り記号のない文字列/整数:
// assuming an string that has no delimiters but adding them each in
$firstDate = sprintf("%s-%s-%s", substr($originalDate, 0, 4), substr($originalDate, 4, 2), substr($originalDate, 6, 2));
$secondDate = sprintf("%s-%s-%s", substr($originalDate, 8, 4), substr($originalDate, 12, 2), substr($originalDate, 14, 2));
上記の 3 つのメソッドは、codepadで実際に見ることができます。
2 つの別々の変数に 2 つの日付がある場合は、それらをデータベースの 2 つの別々の列に格納できます。データベース クエリが常に「開始」日と「終了」日の両方でクエリを実行する場合は、両方の列を同じインデックスにインデックス化できます。それ以外の場合は、両方を個別にインデックス化できます。ユースケースに関係なく、それらを使用するため、インデックスを追加することは、後の速度/最適化を保証するための重要なステップになります =]