1

2つの個別のインデックスを作成したクエリがいくつかありますが、テーブルにはそれほど多くの行が含まれていないため、現時点では実際にそれらを使用する必要はないことを理解しています。ただし、possible keyを使用すると、として表示されませんEXPLAIN

クエリの例は次のとおりです。

SELECT 
    id,eventname,details,datestart,dateend,smallimage
FROM
    `events`
WHERE
    CAST(dateend AS DATE) >= CURDATE()
AND
    (state='VIC' OR state = 'ALL')
AND
    STATUS = 1
ORDER BY
    datestart ASC;

代替クエリは、状態の前に別の句を追加するだけANDです。例は次のとおりです。

 AND eventcat = 15

ここで、次の2つのインデックスを追加しました。

KEY `NewIndex4` (`dateend`,`state`,`status`,`datestart`),
KEY `NewIndex5` (`dateend`,`eventcat`,`state`,`status`,`datestart`)

ただし、MySQLは、可能なキーとして以下のインデックスのみを表示します。

KEY `NewIndex1` (`state`,`status`,`frontpage`,`image`)

私のインデックスは間違っていますか!?なぜこれを行うのですか?

4

1 に答える 1

3

問題は、dateendフィールドでCASTを実行していることです。フィールドで関数を実行すると、そのフィールドのインデックスは使用されません。可能であれば、このフィールドをDATEデータ型に変換することをお勧めします。また、インデックスの最初のフィールドが使用されていない場合、インデックスは無視されます。

フィールドがDATETIMEフィールドの場合、CAST関数は使用しません。単にそれを削除し、そのままにしておきます。

WHERE
    dateend >= CURDATE()

今日の日時の値はすべて一致します。時間を削除する必要はありません。例えば。2012-12-14 01:00:00は、2012-12-14(CURDATE関数が返す)以上になります。

于 2012-12-14T16:19:20.763 に答える