表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
答案 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)
上创建索引来解决此问题。这是一个覆盖指数,所以它应该有一些改进。
如果您确实需要使用通配符匹配字符串,我还建议您考虑全文索引。