2013-08-31 70 views
3

我試圖優化mysql查詢,我用它從數據庫中獲取客戶的地址。 這個問題讓我很生氣,所以我會很感激幫助:)即使使用索引,Mysql查詢仍然很慢

我有兩個表與這個查詢相關:customers_address和systems_address。 我只想獲得具有我可以爲此係統展示的地址的客戶。

例子:

我想擺脫customers_address表,已ADDRESS_ID客戶這是屬於使用子句SYSTEM_ID 2.

最佳查詢:

select distinct customer_id from customers_address use index(address_id_customer_id) where address_id in (select distinct address_id from systems_address where system_id = 2) and address_id !=-1\G; 

東西只有子查詢返回一行(值爲2),如果我用subquerys值運行這個整個查詢它真的很快:

select customer_id from customers_address use index(address_id_customer_id) where address_id !=-1 and address_id in (2)\G; 

時間從10秒降到0.00秒。

我也試着用連接做查詢,但是當我比較查詢的時候我的表現仍然很慢(超過7秒)。 下面相同的查詢聯接:

select distinct customer_id from customers_address use index(address_id_customer_id) inner join systems_address where systems_address.address_id = customers_address.address_id and system_id = 2 and customer_id != -1\G 

我已經把給customers_address 816個000行和systems_address 400個000行。 這些表下面的模式(表簡化這個問題是比較容易找到):

create table systems_address (
    `id` int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `address_id` int(11) DEFAULT NULL, 
    `system_id` INTEGER(11)DEFAULT NULL, 
    KEY `address_id` (address_id), 
    KEY `system_id` (system_id)) 
    ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 

create table customers_address (
    `id` int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `customer_id` int(11) DEFAULT NULL, 
    `address_id` INTEGER(11)DEFAULT NULL, 
    KEY `customer_id` (customer_id), 
    KEY `address_id` (address_id), 
    KEY `address_id_customer_id` (address_id,customer_id), 
    FOREIGN KEY (`address_id`) REFERENCES `systems_address` (`address_id`) ON UPDATE CASCADE ON DELETE SET NULL) 
    ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 

使querys更快任何方式???

這裏是解釋當我運行波希米亞人的查詢(創建這些新的索引和更新後)的結果。

ID:1個
SELECT_TYPE:SIMPLE
表:系統解決
類型:REF
possible_keys:ADDRESS_ID,SYSTEM_ID,address_id_system_id,IDX1, 鍵:IDX1 key_len:5 REF:常量 行: 1999年 額外:使用哪裏;使用臨時

ID:2
SELECT_TYPE:SIMPLE
表:卡斯特omers_address
類型:REF
possible_keys:CUSTOMER_ID,ADDRESS_ID,address_id_customer_id,IDX2
鍵:address_id_customer_id
key_len:5
REF:database.systems_address。ADDRESS_ID
行:45375
額外:使用哪裏;使用索引

+0

刪除了'DISTINCT'子查詢應該加快速度。另外,將連接條件放在一個'ON'子句中而不是'WHERE'子句中可以改進你的連接。 –

+0

如果你仍然有問題,你可以發佈你的'EXPLAIN'輸出嗎? –

回答

1

反轉表的順序並使用連接條件,其中包括額外的條件:

select distinct customer_id 
from systems_address 
join customers_address on systems_address.address_id = customers_address.address_id 
    and customer_id != -1 
where system_id = 2 

這應該表現非常好,使用索引並儘量減少訪問的行數。

確保您有以下指標定義:

create index idx1 on systems_address(system_id); 
create index idx2 on customers_address(address_id); 

只是可以肯定,同時更新的統計數據:

analyze systems_address, customers_address; 
+0

@ user2735698。 。 。如果這解決了問題,那麼你應該接受答案。 –

+0

感謝波西米亞人爲你解答,但表現仍然相同,〜7秒。 – TomRock

+0

請參閱編輯 - 現在嘗試定義索引並更新統計信息。 – Bohemian