MySQL“正在发送数据”很慢

问题描述:

我有一张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

你已经该指数创建正在帮助JOINs,但评估大多数WHERE条件仍然需要MySQL遍历表中的大部分200k行来计算COUNT()。这需要时间。

如果没有对数据库结构进行重大更改,这个查询不可能被优化得更快。

+0

你对“重大变化”是什么意思?创建另一个表? – bertu

+0

你能解释一下变化吗? @duskwuff我想在这个问题上提高自己。如果你能给我们更多的信息。我知道,如果查询必须查询,表中的20%会更快,查询中不使用索引 – Noob