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

6000万エントリ、特定の月からのエントリを選択します。データベースを最適化する方法は?

    特定の月、特定の年のエントリをより速く取得するには、timeにインデックスを付ける必要があります 列

    CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
    

    さらに、以下を使用します:

    SELECT e.* 
      FROM ENTRIES e
     WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
    

    ... BETWEENは包括的であるため、投稿したクエリで「2010-05-0100:00:00」の日付のものを取得します。

    特定のDataSourceIDから特定の月のデータも選択したい

    datasourceid列に個別のインデックスを追加することができます:

    CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
    

    ...または両方の列を含めるようにカバーインデックスを設定します:

    CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
    

    カバーするインデックスでは、使用するインデックスのクエリで左端の列を使用する必要があります。この例では、time 最初は、前述の両方の状況で機能します。インデックスを使用するためにdatasourceidを使用する必要はありません。 ただし、EXPLAIN出力を表示してクエリをテストし、データとそのデータに対して実行されているクエリに最適なものを実際に把握する必要があります。

    とはいえ、インデックスはINSERT、UPDATE、およびDELETEステートメントの速度を低下させます。また、列データに明確な値がほとんどない場合、インデックスは多くの値を提供しません-IE:カーディナリティが低いため、ブール列はインデックス付けに適していません。



    1. オラクルはUNIXエポック時間を日付に変換します

    2. AndroidwithRoom-外部キーをnull許容に設定する方法

    3. SqlDataSourceEnumerator.Instance.GetDataSources()は、ローカルSQLServer2008インスタンスを検索しません

    4. JavaHibernateとSQLServerでのUUIDの異なる表現