Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql查询耗时50秒_Php_Mysql - Fatal编程技术网

Php Mysql查询耗时50秒

Php Mysql查询耗时50秒,php,mysql,Php,Mysql,表reuniao(EN:meeting)有401000条记录,它在所有列上都有一个索引,im使用XAMPP,和 我认为问题在于试图通过计数和连接进行排序,但50秒的时间太长了 列、nome-its-varchar(EN:Name)、presenca-its-varchar(EN:presence)、partido-its-varchar(EN:political party)、id_-deputado-its-PK INT和data(其日期) 这是您的查询,使用适当的JOIN语法编写: SELE

表reuniao(EN:meeting)有401000条记录,它在所有列上都有一个索引,im使用XAMPP,和 我认为问题在于试图通过计数和连接进行排序,但50秒的时间太长了

列、nome-its-varchar(EN:Name)、presenca-its-varchar(EN:presence)、partido-its-varchar(EN:political party)、id_-deputado-its-PK INT和data(其日期)


这是您的查询,使用适当的
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注入。但这与绩效无关

这在MySQL中很难优化,因为类似于模式的
中有通配符。您可以通过在
reuniao(data,partido,presenca,id\u deputado)
deputado(id\u deputado,nome)
上创建索引来实现这一点。这是一个覆盖指数,因此应该有一些改进


我也建议你考虑全文索引,如果你真的需要通配符字符串上的匹配。

从< <代码> >子句中不要使用逗号>逗号>。始终使用正确、明确的
JOIN
语法。还要参数化该查询,不要将
POST
放在查询中,使用这种方法,您将面临注入。我很好奇,一个人从哪里获得了价值40万条的记录,不知道如何处理它,也不知道如何正确处理它。您有自己的理由,这是一个关于网络报废的学校作业,其中一个要求是收集所有数据集Hanks为您解答,我尝试了这个查询,但仍然需要50秒,我在reuniao的所有列上都有一个索引B树,可能使用HASH?,MySQL在deputado(id_deputado,nome)的两列上自动分配了一个B树,但我可以创造one@VoltDamage . . . 您需要了解答案中提到的具体索引。这些是包含多个列的复合索引。
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;