提问者:小点点

我如何改进这个SQL查询以更快,今天它需要很长时间


我需要改进这个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多分钟。欢迎任何建议。


共1个答案

匿名用户

对于写入的查询:

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上的索引。