2015-09-02 2 views
0

Пожалуйста, обратитесь к таблице strcuture ниже.mysql indexing делает группу медленным

CREATE TABLE `oarc` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `zID` int(11) NOT NULL, 
    `cID` int(11) NOT NULL, 
    `bID` int(11) NOT NULL, 
    `rtype` char(1) COLLATE utf8_unicode_ci NOT NULL, 
    `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1821039 ; 

Помимо PRIMARY KEY, я не установил никакого индекса на этом, и когда я запускаю следующий запрос

select COUNT(oarc.ID) as total 
    from `oarc` where`oarc`.`rtype` = 'v' 
group 
    by `oarc`.`zID` 

Я получаю результат менее чем за 1 секунду. Но если я добавлю индекс в zID, он занимает более 5 секунд.

Пожалуйста, смотрите ниже объяснить результат:

id | select_type | table | type | possible_keys | key  | key_len | ref  | row  | Extra 
-------------------------------------------------------------------------------------------------------- 
1 | SIMPLE  | oarc | index | NULL   | zone_ID | 4  | NULL  | 1909387 | Using where 

В настоящее время в таблице имеют более 1821039 записей в ней, и она будет увеличиваться на почасовой основе. Что мне нужно сделать, чтобы сократить время выполнения запроса. Я ожидаю только что-то за столом и уровнем запросов, ничего на my.cnf или на стороне сервера, потому что я ничего не могу там сделать.

Заранее спасибо.

+0

Индекс на rtype окажется более полезным, но все равно опубликуйте объяснение. – Strawberry

+0

Объяснение добавленного результата – aarpey

+0

EXPLAIN ссылается на столбец, отсутствующий в таблице. – Strawberry

ответ

0

Это лучше?

CREATE TABLE `oarc` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `zID` int(11) NOT NULL, 
    `cID` int(11) NOT NULL, 
    `bID` int(11) NOT NULL, 
    `rtype` char(1) COLLATE utf8_unicode_ci NOT NULL, 
    `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`ID`), 
    KEY(rtype,zid) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1821039 ; 

explain 
select COUNT(oarc.ID) as total 
    from `oarc` where`oarc`.`rtype` = 'v' 
group 
    by `oarc`.`zID` 

+----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra     | 
+----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+ 
| 1 | SIMPLE  | oarc | ref | rtype   | rtype | 3  | const | 1 | Using where; Using index | 
+----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+ 
+0

Это лучше всего. Не могли бы вы объяснить, как это работает. Являются ли индексы в том порядке, который вызывается в нашем sql-запросе? В этом случае rtype используется в том, где до zID в группе - я правильно? – aarpey

+0

Ну, что произойдет, если вы измените порядок столбцов в индексе? – Strawberry

Смежные вопросы