我需要改进这个sql的执行时间,这是我此刻正在使用的代码。对于小表,它表现良好,在第一个表的参与者,我有一个平均5000个条目。第二个,有6万多个。代码在第一个表中执行搜索,按ID进行筛选,并将与第二个表相同的ID分组,生成单个字符串。
SELECT `participant_name`,` participant cpf`, `participant fone`, GROUP_CONCAT (`idnumber` SEPARATOR ', ')
FROM `participants` to` p`
INNER JOIN` sorteio_18` as`s`
ON s.cpf = p.cpf_participant
GROUP BY `cpf_participante`
第一个表的结构如下
participant_id INT 11
participant_name VAR 100
cpf_participant VAR 14
participant_birthday DATE
participant_phone VAR 16
qtd_numbers INT 3
participant_email VAR 100
status_transacao INT 1
payment_form INT 1
cep_participante INT 8
lucky INT 10
city VAR 100
uf VAR 2
neighborhood VAR 100
address VAR 100
number INT 4
purchase_date DATE
order_number VAR 15
transaction VAR 100
code VAR 100
price_price DEC 10,2
第二个表是
idnumber INT 11
fullname VAR 100
phone VAR 16
email VAR 100
cpf VAR 14
cep INT 8
participant_id INT 11
neighborhood VAR 100
address VAR 100
active INT 1
有人能给我一个想法,如何提高这个sql的搜索时间,因为今天生成完整的查询需要10多分钟。欢迎任何建议。
对于写入的查询:
SELECT p.participant_name, p.`participant cpf`, p.`participant fone`,
GROUP_CONCAT(s.idnumber SEPARATOR ', ')
FROM participants p INNER JOIN`
sorteio_18 s
ON s.cpf = p.cpf_participante
GROUP BY p.cpf_participante;
我建议将cpf_partipante
定义为主键。然后在sorteIO_18(cpf,idnumber)
上有一个索引。
不过,使用起来可能会更快:
select p.*, -- whatever columns you want
(select group_concat(s.idnumber separator ', ')
from sorteio_18 s
where s.cpf = p.cpf_participante
) as idnumbers
from participant p;
这只需要上面描述的sorteIO_18
上的索引。