2017-01-01 4 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.

Что касается самого запроса - без изменения структуры вашей таблицы вы не можете реально оптимизировать его (если вы не знаете, какой ids пригонки WHERE и вы можете изменить запрос, чтобы использовать id> X, потому что id столбец в таблице индексируется, но я думаю, что это не так).

+0

он спросил, как оптимизировать запрос, а не модель :-) – Sebas

+0

@Sebas, правильно! Я добавлю примечание относительно этого – Dekel

+0

Я был вроде дразнящим. Ваше решение является наиболее очевидным:) – Sebas