Mysql查询需要50秒

时间:2017-06-03 11:39:47

标签: php mysql

表reuniao(EN:会议),有401000条记录,并且它在所有列上都有索引,即时通讯使用XAMPP,以及 我认为问题在于尝试在COUNT和Join上进行ORDER BY,但是50秒就可以了。

列,nome其varchar(EN:名称),presenca其varchar(EN:presence),partido其varchar(EN:政党),id_deputado其PK INT和数据(其日期)。

SELECT D.nome, COUNT(*) as count_dep_faltas 
FROM reuniao R, deputado D 
WHERE R.partido LIKE '%$_POST[partido]%' AND 
R.presenca LIKE '%Injustific%' AND 
data BETWEEN '$data_incio' AND '$data_fim' and 
R.id_deputado=D.id_deputado 
GROUP BY D.nome 
ORDER BY count_dep_faltas DESC 
LIMIT 5

1 个答案:

答案 0 :(得分:1)

这是您的查询,使用正确的JOIN语法编写:

SELECT D.nome, COUNT(*) as count_dep_faltas
FROM deputado D JOIN
     reuniao R
     ON R.id_deputado = D.id_deputado
WHERE R.partido LIKE '%$_POST[partido]%' AND
      R.presenca LIKE '%Injustific%' AND
      R.data BETWEEN '$data_incio' AND '$data_fim'
GROUP BY D.nome
ORDER BY count_dep_faltas DESC;
LIMIT 5;

首先,您需要学习使用参数传入查询,而不是重复查询字符串。这可以防止意外的语法错误和SQL注入。但这与表现无关。

由于LIKE模式中的通配符,因此很难在MySQL中进行优化。您可以通过在reuniao(data, partido, presenca, id_deputado)deputado(id_deputado, nome)上创建索引来解决此问题。这是一个覆盖指数,所以它应该有一些改进。

如果您确实需要使用通配符匹配字符串,我还建议您考虑全文索引。