2017-01-01 32 views
1

我是數據庫查詢優化的新手。 下面是創建表查詢:1000萬行花費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

關於查詢本身 - 在不改變你的表的結構,你不能真正優化它(除非你知道哪個ids適合WHERE,你可以改變使用id> X查詢,因爲在你的表中的列id被索引,但我想這不是真的)。

+0

他問如何優化查詢,而不是模型:-) – Sebas

+0

@ Sebas,正確!我會添加一個關於這個 – Dekel

+0

的筆記我很開玩笑。你的解決方案是最明顯的解決方案;) – Sebas