我試圖優化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
額外:使用哪裏;使用索引
刪除了'DISTINCT'子查詢應該加快速度。另外,將連接條件放在一個'ON'子句中而不是'WHERE'子句中可以改進你的連接。 –
如果你仍然有問題,你可以發佈你的'EXPLAIN'輸出嗎? –