2017-01-01 1 views
1

データベース問合せの最適化が初めてです。 はここで、テーブルのクエリを作成します単純な型問合せのために10ミリ秒の行が3.50秒かかる

CREATE TABLE mo (
    id int UNSIGNED NOT NULL auto_increment, 
    msisdn varchar(20) NOT NULL, 
    operatorid int UNSIGNED NOT NULL, 
    shortcodeid int UNSIGNED NOT NULL, 
    text varchar(100) NOT NULL, 
    auth_token varchar(60) NOT NULL, 
    created_at DATETIME, 
    PRIMARY KEY(id) 
); 

私のクエリはこれです:

SELECT count(id) as mo_count from mo where created_at > DATE_SUB(NOW(), INTERVAL 15 MINUTE) 

私は結果が

Time taken for tests: 3.50 seconds 

[0] => Array 
(
    [id] => 1 
    [select_type] => SIMPLE 
    [table] => mo 
    [type] => ALL 
    [possible_keys] => 
    [key] => 
    [key_len] => 
    [ref] => 
    [rows] => 10000255 
    [Extra] => Using where 
) 

だったそれをテストしたときにどのようにこのクエリを最適化することを教えてください。どうもありがとうございます。

+0

この表が増え続ける場合は、その数を頻繁にクエリすると、新しいデザインに興味があるかもしれません。たとえば、最後のレコードを非常に小さい「常にフレッシュな」表に保つことができます。一方、すべてのレコードを含む「履歴」テーブルがあります。また、特定の期間(日)ごとにテーブルを分割して分割することもできます。これにより、各カウントクエリのIOが制限されます。 – Sebas

答えて

5

このクエリに使用する列にINDEXを追加する必要があります。それ以外の場合は、データベース内のすべての行をチェックして、WHERE句に一致するものを確認する必要があります。

ALTER TABLE mo ADD INDEX (created_at); 

indexは、あなたがその列に持っているデータに基づいて、MySQLのあなたのテーブルの一部だけをスキャンすることができます。

how mysql uses indexesについて詳しく読むことができます。クエリ自体について

- あなたはWHEREに合わせて、あなたがid> Xを使用するようにクエリを変更することができたids知っている限り、あなたのテーブルの構造を変更することなく、あなたが本当にあなたのテーブルでidコラムので、(それを最適化することはできませんインデックスされていますが、実際にはそうではないと思います)。

+0

彼はモデルではなく、クエリを最適化する方法を尋ねました:-) – Sebas

+0

@Sebas、正しい!私はこれについてのメモを追加します – Dekel

+0

私はいじめのようなものでした。あなたの解決策は最も明白です;) – Sebas

関連する問題