2017-08-28 25 views
0

我有一張200k +記錄的表格,我正在嘗試執行COUNT(*)搜索。搜索似乎非常快,直到進入發送數據階段。MySQL「正在發送數據」很慢

CREATE TABLE `evento_inscricao_participante_ingresso` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`id_participante` int(11) DEFAULT NULL, 
`id_carrinho` int(11) DEFAULT NULL, 
`id_cortesia` int(11) DEFAULT NULL, 
`codigo` varchar(255) DEFAULT NULL, 
`checkin` datetime DEFAULT NULL, 
`criado_em` datetime DEFAULT NULL, 
`modificado_em` datetime DEFAULT NULL, 
`criado_por` int(11) DEFAULT NULL, 
`modificado_por` int(11) DEFAULT NULL, 
`deletado` int(1) DEFAULT '0', 
`deletado_por` int(11) DEFAULT NULL, 
`deletado_em` datetime DEFAULT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `codigo_UNIQUE` (`codigo`), 
KEY `fk_evento_inscricao_participante_ingresso_evento_inscricao__idx` (`id_participante`), 
KEY `fk_evento_inscricao_participante_ingresso_evento_inscricao__idx1` (`id_carrinho`), 
KEY `fk_evento_inscricao_participante_ingresso_evento_cortesia1_idx` (`id_cortesia`), 
CONSTRAINT `fk_evento_inscricao_participante_ingresso_evento_inscricao_ca1` FOREIGN KEY (`id_carrinho`) REFERENCES `evento_inscricao_carrinho` (`id`) ON DELETE SET NULL ON UPDATE SET NULL, 
CONSTRAINT `fk_evento_inscricao_participante_ingresso_evento_inscricao_pa1` FOREIGN KEY (`id_participante`) REFERENCES `evento_inscricao_participante` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=175477 DEFAULT CHARSET=utf8; 

查詢

SELECT COUNT(*) 
      FROM evento_inscricao_participante_ingresso t 
      LEFT JOIN evento_inscricao_carrinho c ON (c.id = t.id_carrinho) 
      LEFT JOIN evento_inscricao_participante p ON (p.id = t.id_participante) 
      LEFT JOIN evento_ingresso i ON (i.id = c.id_ingresso) 
      LEFT JOIN evento_inscricao ins ON (ins.id = c.id_inscricao) 
      LEFT JOIN evento_cortesia cortesia ON (t.id_cortesia = cortesia.id) 
      WHERE (i.id_evento = 894 
      AND i.id = 3255 AND ins.id_status = 1) 
      OR (cortesia.id_evento = 894 
      AND cortesia.id_ingresso = 3255 AND t.id_cortesia IS NOT NULL) 

資料

starting 0.000104 
checking permissions 0.000004 
checking permissions 0.000002 
checking permissions 0.000002 
checking permissions 0.000001 
checking permissions 0.000002 
checking permissions 0.000004 
Opening tables 0.000048 
System lock 0.000010 
init 0.000029 
optimizing 0.000016 
statistics 0.000035 
preparing 0.000020 
executing 0.000004 
Sending data 18.216500 
end 0.000010 
query end 0.000004 
closing tables 0.000013 
freeing items 0.000106 
logging slow query 0.000004 
cleaning up 0.000004 

說明

1 SIMPLE t ALL fk_evento_inscricao_participante_ingresso_evento_cortesia1_idx NULL NULL NULL 205120 NULL 
1 SIMPLE c eq_ref PRIMARY PRIMARY 4 ingresso_main.t.id_carrinho 1 NULL 
1 SIMPLE p eq_ref PRIMARY PRIMARY 4 ingresso_main.t.id_participante 1 Using index 
1 SIMPLE i eq_ref PRIMARY PRIMARY 4 ingresso_main.c.id_ingresso 1 Using where 
1 SIMPLE ins eq_ref PRIMARY PRIMARY 4 ingresso_main.c.id_inscricao 1 Using where 
1 SIMPLE cortesia eq_ref PRIMARY PRIMARY 4 ingresso_main.t.id_cortesia 1 Using where 

所以我不明白爲什麼,如果我已經創建的索引花太多的時間。當我刪除較舊的記錄時,時間改善50%。我在生產測試(亞馬遜RDS/m3.medium/35年6月5日)和本地主機(MySQL的35年6月5日)

指標用於中使用的所有表的連接:

evento_inscricao_carrinho 0 PRIMARY 1 id A 76098 NULL NULL  BTREE  
evento_inscricao_carrinho 1 FK_incricao_carrinho_x_evento_ingresso 1 id_ingresso A 76098 NULL NULL YES BTREE  
evento_inscricao_carrinho 1 FK_incricao_carrinho_x_usuario 1 id_usuario A 76098 NULL NULL YES BTREE  
evento_inscricao_carrinho 1 FK_evento_inscricao_carrinho_x_evento_inscricao 1 id_inscricao A 76098 NULL NULL YES BTREE  
evento_inscricao_carrinho 1 fk_evento_inscricao_carrinho_evento_codigo_desconto1_idx 1 id_codigo_desconto A 76098 NULL NULL YES BTREE  
evento_inscricao_carrinho 1 fk_evento_inscricao_carrinho_evento_convite_envio1_idx 1 id_convite_restrito A 76098 NULL NULL YES BTREE  

evento_inscricao_participante 0 PRIMARY 1 id A 69614 NULL NULL  BTREE  
evento_inscricao_participante 1 fk_evento_inscricao_participante_evento_inscricao1_idx 1 id_inscricao A 69614 NULL NULL YES BTREE  
evento_inscricao_participante 1 fk_evento_inscricao_participante_evento_inscricao_carrinho1_idx 1 id_carrinho A 69614 NULL NULL YES BTREE  


evento_ingresso 0 PRIMARY 1 id A 4021 NULL NULL  BTREE  
evento_ingresso 1 FK_evento_ingresso_x_inquilino 1 id_inquilino A 670 NULL NULL YES BTREE  
evento_ingresso 1 FK_evento_ingresso_x_evento 1 id_evento A 4021 NULL NULL YES BTREE  
evento_ingresso 1 fk_evento_ingresso_evento_ingresso1_idx 1 id_ingresso_lote A 6 NULL NULL YES BTREE  

evento_inscricao 0 PRIMARY 1 id A 90011 NULL NULL  BTREE  
evento_inscricao 1 FK_evento_incricao_x_tipo_pagamento 1 id_pagamento_tipo A 90011 NULL NULL YES BTREE  
evento_inscricao 1 FK_evento_inscricao_x_evento 1 id_evento A 90011 NULL NULL YES BTREE  
evento_inscricao 1 FK_evento_inscricao_x_usuario 1 id_usuario A 90011 NULL NULL YES BTREE  
evento_inscricao 1 fk_evento_inscricao_evento_inscricao_status1_idx 1 id_status A 90011 NULL NULL YES BTREE  
evento_inscricao 1 fk_evento_inscricao_evento_recorrencia1_idx 1 id_recorrencia A 90011 NULL NULL YES BTREE  
evento_inscricao 1 fk_evento_inscricao_terminal1_idx 1 id_terminal A 90011 NULL NULL YES BTREE  

evento_cortesia 0 PRIMARY 1 id A 778 NULL NULL  BTREE  
evento_cortesia 1 FK_evento_apoio_x_evento 1 id_evento A 129 NULL NULL YES BTREE  
evento_cortesia 1 fk_evento_cortesia_evento_recorrencia1_idx 1 id_recorrencia A 1 NULL NULL YES BTREE  
evento_cortesia 1 fk_evento_cortesia_evento_ingresso1_idx 1 id_ingresso A 259 NULL NULL YES BTREE  
evento_cortesia 1 fk_evento_cortesia_terminal1_idx 1 id_terminal A 21 NULL NULL YES BTREE  
+0

您能否向我們提供您在連接和主表中提到的所有表格的顯示索引? – Noob

+1

請不要使用pastebin之類的非現場資源來解決您的問題。這裏的目的是讓其他人從你的經驗中學習,如果你將重要的信息埋在網站外面,你就會失敗。 –

+0

對不起,我會用索引編輯我的帖子。 – bertu

回答

1

你已經該指數創建正在幫助JOINs,但評估大多數WHERE條件仍然需要MySQL遍歷表中的大部分200k行來計算COUNT()。這需要時間。

如果沒有對數據庫結構進行重大更改,這個查詢不可能被優化得更快。

+0

你對「重大變化」是什麼意思?創建另一個表? – bertu

+0

你能解釋一下變化嗎? @duskwuff我想在這個問題上提高自己。如果你能給我們更多的信息。我知道,如果查詢必須查詢,表中的20%會更快,查詢中不使用索引 – Noob