sql >> データベース >  >> RDS >> Mysql

MySQL複合インデックスと演算子BETWEEN

    あなたのスタイルは非常に珍しいです。

    ほとんどの人はおそらくWHERE began_at < NOW() AND finished_at > NOW()と書くでしょう。

    でも。両方のフィールドにインデックスを付けることをお勧めします。

    組み合わせたキーは、特定の日付の組み合わせで検索者を高速化するだけなので、役に立ちません。

    betreeを使用する場合は、組み合わせたキーが役立ちますが、個別にインデックスを作成する場合ほど良くないため、これは完全には当てはまりません。等しい(=)演算子を使用してフィールドの組み合わせを検索する場合、組み合わせたキーは非常に優れています。 SIngleフィールドインデックスは、ラーゲンリクエストでより優れたパフォーマンスを発揮します。

    あなたは「多次元範囲検索」のために少しグーグルすることができます。

    その理由は、1つのフィールドで一致するすべてのフィールドが基本的にbtreesのlog(n)時間で見つかるためです。したがって、全体の実行時間はO(k * log(n))、つまりO(log(n))になります。

    多次元範囲クエリには、より高いO(sqrt(n))の実行時間があります。ただし、対数ランタイムを達成するより良い実装もあります。ただし、それらはmysqlで完全に実装されていないため、バージョンによってはさらに悪くなるか、ひどいものになります。

    要約すると:

    • 単一フィールドでの等式比較:ハッシュインデックス(ランタイムO(1))

    • 単一フィールドの範囲検索:単一フィールドのbtreeインデックス(O(log(n)))

    • 複数のフィールドでの等式検索:結合されたハッシュキー(ランタイムO(1))

    それらのケースは明らかです...

    • 複数のフィールドでの範囲検索:個別のbtreeインデックス(O(log(n)))

    これはそれほど明確ではないところです。現在のバージョンでは、上記の理由により、個別にインデックスを作成する方が明らかに優れています。そのユースケースの完璧な実装を使用すると、組み合わせたキーでパフォーマンスを向上させることができますが、それをサポートするシステムはありません。mysqlはルーズインデックスをサポートします(そのために必要です)バージョン5.0以降ですが、非常に限られており、クエリオプティマイザはまれにafaikでのみそれらを利用します。 5.3などの新しいバージョンについてはわかりません。

    ただし、mysqlがルーズインデックスを実装すると、範囲要求を実行したり、さまざまな方向に並べ替えたりするフィールドにキーを組み合わせて、ますます関連性が高まります。



    1. Codeigniter AND OR AND

    2. ER_NOT_SUPPORTED_AUTH_MODE-MySQLサーバー

    3. PythonでMySQLデータベースに挿入した後にIDを取得するにはどうすればよいですか?

    4. SQLサーバーがこのエラーをスローするのはなぜですか:値NULLを列'id'に挿入できませんか?