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

MySQL:OR句にインデックスを付ける方法

    ORを分割する一般的な方法 述語はUNIONを使用します 。

    あなたの例はあなたのインデックスにうまく適合しないことに注意してください。 field1を省略した場合でも 述語から、field2 >= 1000 OR field3 >= 2000になります。 、インデックスを使用できません。 (field1, field2)にインデックスがある場合 および(field1,field3) またはfield2 またはfield3 個別に、適度に高速なクエリを取得します。

    SELECT COUNT(*) FROM
    (SELECT * FROM table WHERE field1 = 'value' AND field2 >= 1000
    UNION
    SELECT * FROM table WHERE field1 = 'value' AND field3 >= 2000) T
    

    派生テーブルのエイリアスを指定する必要があることに注意してください。そのため、サブクエリはTとしてエイリアスされます。 。

    実際の例。列名とテーブル名は匿名化されています!

    mysql> SELECT COUNT(*) FROM table;
    +----------+
    | COUNT(*) |
    +----------+
    |  3059139 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> SELECT COUNT(*) FROM table WHERE columnA = value1;
    +----------+
    | COUNT(*) |
    +----------+
    |     1068 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> SELECT COUNT(*) FROM table WHERE columnB = value2;
    +----------+
    | COUNT(*) |
    +----------+
    |      947 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> SELECT COUNT(*) FROM table WHERE columnA = value1 OR columnB = value2;
    +----------+
    | COUNT(*) |
    +----------+
    |     1616 |
    +----------+
    1 row in set (9.92 sec)
    
    mysql> SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
    UNION SELECT * FROM table WHERE columnB = value2) T;
    +----------+
    | COUNT(*) |
    +----------+
    |     1616 |
    +----------+
    1 row in set (0.17 sec)
    
    mysql> SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
    UNION ALL SELECT * FROM table WHERE columnB = value2) T;
    +----------+
    | COUNT(*) |
    +----------+
    |     2015 |
    +----------+
    1 row in set (0.12 sec)
    


    1. Oracleで可能な最大の日付を取得するにはどうすればよいですか?

    2. postgres-where in(list)-列は存在しません

    3. 既存のmysqlデータベースを置き換えずにWampServerを再インストールする

    4. AWSRDSバックアップメソッド