2015-09-02 89 views
0

請參閱下面的表strcuture。mysql索引使組緩慢

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