2008-12-08 82 views
1

好吧,我不是在MySQL很大,但我知道指數會幫助我在這裏,但是我已經做了一些堵塞,不能找到一個幫...幫助與索引

任何人有任何想法?

explain 
select `users_usr`.`id_usr` AS `id_usr`, 
`users_usr`.`firstname_usr` AS `firstname_usr`, 
`users_usr`.`lastname_usr` AS `lastname_usr`,`users_usr`.`social_usr` AS `social_usr`,`users_usr`.`address1_usr` AS `address1_usr`, 
`users_usr`.`address2_usr` AS `address2_usr`,`users_usr`.`city_usr` AS `city_usr`,`users_usr`.`state_usr` AS `state_usr`,`users_usr`.`zip_usr` AS `zip_usr`, 
`users_usr`.`email_usr` AS `email_usr`,`credit_acc`.`given_credit_acc` AS `given_credit_acc`,`credit_acc`.`credit_used_acc` AS `credit_used_acc`, 
`credit_acc`.`date_established_acc` AS `date_established_acc`,`credit_acc`.`type_acc` AS `type_acc`,`credit_acc`.`bureau_status_acc` AS `bureau_status_acc`, 
sum((`credit_balance`.`debit_acc` - `credit_balance`.`credit_acc`)) AS `balance` 



from (((`users_usr` 
left join `credit_acc` on((`users_usr`.`id_usr` = `credit_acc`.`uid_usr`))) 
left join `cfc_cfc` on((`credit_acc`.`id_cfc` = `cfc_cfc`.`id_cfc`))) 
join `credit_acc` `credit_balance` on((`credit_balance`.`credit_used_acc` = `credit_acc`.`id_acc`))) 

where ((`credit_acc`.`type_acc` = _latin1'init') 
and (`credit_acc`.`status_acc` = _latin1'active') 
and (`credit_acc`.`linetype_acc` = _latin1'personal')) 

group by `credit_balance`.`credit_used_acc` order by `users_usr`.`id_usr` 

給我

id select_type table   type possible_keys      key    key_len ref         rows Extra       
------ ----------- -------------- ------ ----------------------------------- --------------- ------- --------------------------------- ------ ------------------------------- 
    1 SIMPLE  credit_balance index credit_used_acc,cash_report_index credit_used_acc 40  (NULL)        14959 Using temporary; Using filesort 
    1 SIMPLE  credit_acc  eq_ref PRIMARY,type_acc,type_acc_2,uid_usr PRIMARY   8  cc.credit_balance.credit_used_acc  1 Using where      
    1 SIMPLE  cfc_cfc   eq_ref PRIMARY        PRIMARY   4  cc.credit_acc.id_cfc     1 Using index      
    1 SIMPLE  users_usr  eq_ref PRIMARY,id_usr      PRIMARY   4  cc.credit_acc.uid_usr     1 



Table  Non_unique Key_name   Seq_in_index Column_name    Collation Cardinality Sub_part Packed Null Index_type Comment 
---------- ---------- ----------------- ------------ ----------------------- --------- ----------- -------- ------ ------ ---------- ------- 
credit_acc   0 PRIMARY      1 id_acc     A    14016 (NULL) (NULL)   BTREE    
credit_acc   1 type_acc      1 type_acc     A     11 (NULL) (NULL) YES  BTREE    
credit_acc   1 type_acc      2 date_acc     A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 type_acc      3 affiliate_aff   A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 type_acc_2     1 type_acc     A     11 (NULL) (NULL) YES  BTREE    
credit_acc   1 type_acc_2     2 date_acc     A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 type_acc_2     3 complete_acc    A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 type_acc_2     4 commission_refunded_acc A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 credit_used_acc    1 credit_used_acc   A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 credit_used_acc    2 id_acc     A    14016 (NULL) (NULL)   BTREE    
credit_acc   1 credit_used_acc    3 type_acc     A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 uid_usr      1 uid_usr     A     7008 (NULL) (NULL) YES  BTREE    
credit_acc   1 cash_report_index    1 credit_used_acc   A     7008 (NULL) (NULL) YES  BTREE    
credit_acc   1 cash_report_index    2 type_acc     A    14016 (NULL) (NULL) YES  BTREE    
credit_acc   1 cash_report_index    3 date_established_acc  A    14016 (NULL) (NULL) YES  BTREE    
+0

最後加入什麼?之前沒有看到! – benlumley 2008-12-08 21:46:56

回答

0

你的EXPLAIN輸出顯示你已經擁有的索引是可能是有用的,但查詢引擎已決定不使用它們。

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html說:

使用臨時

要解決查詢,MySQL需要來 創建一個臨時表來保存 結果。如果 查詢包含以不同方式列出列的GROUP BY和ORDER BY 子句,則通常會發生這種情況。

您的查詢包括:

GROUP BY `credit_balance`.`credit_used_acc` 
ORDER BY `users_usr`.`id_usr` 

你的名字在這兩個條款不同的列,所以這意味着查詢需要一個臨時表,並在磁盤上的排序結果。磁盤I/O是SQL性能的主要敵人。這可能比通過應用索引可以彌補的性能更不利。

所以我建議嘗試刪除ORDER BY子句,看看它是否擺脫了「使用臨時」評論。

編輯好吧,我已經做了一些更多的測試,並仔細查看了你的表格。

我認爲你有很多索引是多餘的,不適用於這個當前查詢。這可能是索引對其他查詢有用,或者它們可能只是您實驗中的剩菜。

一個觀察是,您加入cfc_cfc是不必要的,但我從您的評論中看到,您已將它取出。儘管它似乎沒有修復EXPLAIN報告。

另一種觀察是,你的LEFT JOIN是不必要的;它可能是INNER JOIN,因爲無論如何,這些列的WHERE子句中都有條件。它不是一個外連接的目的,外連接往往會變慢。

索引可能對您在連接條件中使用的列或行限制或GROUP BY或ORDER BY子句有用。 MySQL不能在給定查詢中的每個表中使用多個索引,因此定義複合索引是有意義的。但是您應該在查詢中使用的列上定義索引。如果您只使用三列索引的第2列和第3列(即不是索引中的第一列),則索引無效。

當然也有含蓄的所有主鍵和外鍵約束創建的索引,但這裏是我創建的唯一額外的索引:

KEY columns_used_in_query (uid_usr, type_acc, status_acc, linetype_acc), 

,如果你把你的情況應該沒有關係的優化方案在WHERE子句或連接條件中,只要它們不是外連接的條件的一部分。但是我注意到所有其他事物都是平等的,優化器似乎會根據您首先定義的那個選擇一個索引!

我仍然沒有將EXPLAIN報告中的臨時表& filesort註釋掉,但我認爲這些更改會加快查詢速度。

+0

好吧,我殺了命令,並沒有改變任何查詢。但是,我確實在JUST status_acc上創建了一個索引,它使我從所檢查的行的100%中抽取了大約20%,但我仍然有一個臨時文件和文件夾。 – bbutle01 2008-12-08 21:43:14

0

收回一些,重新開始。

這是我對你的查詢的解釋。

uu.select uu.id_usr,
uu.firstname_usr,
uu.lastname_usr,
uu.social_usr,
uu.address1_usr,
uu.address2_usr,
uu.city_usr,
UU .state_usr,
uu.zip_usr,
uu.email_usr,
ca.given_credit_acc,
ca.credit_used_acc,
ca.date_established_acc,
ca.type_acc,
ca.bureau_status_acc,
總和(cb.debit_acc - cb.credit_acc)AS balance

從users_usr AS UU

左加入credit_acc與CA上uu.id_usr = ca.uid_usr

加入credit_acc AS上ca.credit_used_acc CB = ca.id_acc

其中ca.type_acc =' INIT」
和ca.status_acc = '積極的'
和ca.linetype_acc = '個人' 由cb.credit_used_acc
爲了通過uu.id_usr

+0

拉出了cfc_cfc表,忘了我不再使用它了,沒有什麼幫助,因爲它只是在那裏看着一排,但最好是更乾淨。 – bbutle01 2008-12-08 21:58:53

0

你的查詢(具有該優化的部分

組聯接,何在,團體和排序)可以簡化爲:

SELECT
uu.select uu.id_usr,
ca.given_credit_acc,
ca.c redit_used_acc,
ca.type_acc,
sum(cb.debit_acc - cb。credit_acc)AS balance

FROM
users_usr AS UU

LEFT JOIN
credit_acc AS上uu.id_usr = ca.uid_usr
AND ca.type_acc CA = '初始化'
AND ca.status_acc = '主動'
AND ca.linetype_acc = '個人'
- credit_acc需要在uid_usr + type_acc _ status_acc索引

JOIN
credit_acc AS上ca.credit_used_acc CB = ca.id_acc
- credit_acc需要BY uu.id_usr

注意,我把上credit_used_acc指數

GROUP BY cb.credit_used_acc
ORDER WHERE子句並將其移入JOIN中 - MySQL似乎喜歡這種調整。

請注意關於索引的評論。看看你是否能夠簡化工作(並優化),然後添加其他字段。

您怎麼看比爾?