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

MySqlがBETWEENクエリを自動的に最適化しないのはなぜですか?

    リンゴとオレンジを比較しているので、このような比較は意味がありません。

    これらの2つのクエリは同等ではなく、異なる結果をもたらします。
    したがって、MySqlは異なる方法でそれらを最適化します。計画は異なる場合があります。

    次の簡単な例を参照してください: http:/ /sqlfiddle.com/#!9/98678/2

    create table account_range(
      is_active int,
      range_start int,
      range_end int
     );
    
     insert into account_range values
     (1,-20,100), (1,10,30);
    

    最初のクエリは2行になります:

    select * from account_range
     where is_active = 1 and 25 between range_start AND range_end;
    
    | is_active | range_start | range_end |
    |-----------|-------------|-----------|
    |         1 |         -20 |       100 |
    |         1 |          10 |        30 |
    

    2番目のクエリは1行のみを提供します:

    SELECT * FROM account_range
    WHERE
        is_active = 1 AND 
        range_start = (SELECT MAX(range_start)
                       FROM account_range
                       WHERE range_start <= 25
        ) AND 
        range_end = (SELECT MIN(range_end)
                     FROM account_range
                     WHERE range_end >= 25
        )
    
    | is_active | range_start | range_end |
    |-----------|-------------|-----------|
    |         1 |          10 |        30 |
    

    このクエリ(最初のクエリ)を高速化するために、2つのビットマップインデックスを「ビットマップと」操作と一緒に使用できますが、MySqlにはそのような機能はありません。

    別のオプションは空間インデックスです(たとえば、PostgreSqlのGINインデックス: http://www.postgresql。 org / docs / current / static / textsearch-indexes.html )。

    そして別のオプションはスター変換(またはスタースキーマ)です-このテーブルを2つの「ディメンション」または「メジャー」テーブルと1つの「ファクト」テーブルに「分割」する必要があります。 ..しかし、これは広すぎるトピックです。詳細を知りたい場合は、ここから始めることができます: https:/ /en.wikipedia.org/wiki/Star_schema



    1. MAMPインストールでターミナルからmysqlコマンドを実行する方法は?

    2. Oracle12cの休止状態の方言

    3. Knex.js-式でフィールドを更新する方法

    4. プログラムでPostgresJDBCの`DataSource`オブジェクトを生成します