提高PHP MYSQL查询性能还是服务器问题?

提高PHP MYSQL查询性能还是服务器问题?,php,mysql,performance,Php,Mysql,Performance,我有一个疑问: SELECT a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode FROM table_name_a a WHERE a.nome != '' AND a.codigo!='5555555' AND a.codigo!='705416' UNION ALL SELE

我有一个疑问:

SELECT
a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode
FROM table_name_a a
WHERE a.nome != ''
AND a.codigo!='5555555'
AND a.codigo!='705416'


UNION ALL

SELECT
b.cod AS code, b.nome AS name, b.especialidade AS expertise, b.telem1 AS mobile, b.mail AS email, b.cp AS zipcode
FROM table_name_b b
WHERE b.nome != ''
AND b.cod!='5555555'
AND b.cod!='705416'
AND b.cod NOT IN(SELECT assoc.codigo from table_name_a assoc) 

ORDER BY code ASC
表A:+/-6000行(并在增长)

表B:+/-2000行(并在增长)

问题:

SELECT
a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode
FROM table_name_a a
WHERE a.nome != ''
AND a.codigo!='5555555'
AND a.codigo!='705416'


UNION ALL

SELECT
b.cod AS code, b.nome AS name, b.especialidade AS expertise, b.telem1 AS mobile, b.mail AS email, b.cp AS zipcode
FROM table_name_b b
WHERE b.nome != ''
AND b.cod!='5555555'
AND b.cod!='705416'
AND b.cod NOT IN(SELECT assoc.codigo from table_name_a assoc) 

ORDER BY code ASC
当一个或两个用户正在使用服务器对数据库执行多个查询时,此查询运行良好。。。但是当服务器被使用时,比如说在白天,有10个用户执行多个查询,在任何给定的时间大约有+/-1000个客户端执行一些查询,查询来自:

显示第0-29行(总计7138行,查询耗时0.0734秒)

显示第0-29行(总计7138行,查询耗时100.0933秒)

提问:

SELECT
a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode
FROM table_name_a a
WHERE a.nome != ''
AND a.codigo!='5555555'
AND a.codigo!='705416'


UNION ALL

SELECT
b.cod AS code, b.nome AS name, b.especialidade AS expertise, b.telem1 AS mobile, b.mail AS email, b.cp AS zipcode
FROM table_name_b b
WHERE b.nome != ''
AND b.cod!='5555555'
AND b.cod!='705416'
AND b.cod NOT IN(SELECT assoc.codigo from table_name_a assoc) 

ORDER BY code ASC
这是查询性能问题还是服务器配置/性能问题

编辑:

SELECT
a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode
FROM table_name_a a
WHERE a.nome != ''
AND a.codigo!='5555555'
AND a.codigo!='705416'


UNION ALL

SELECT
b.cod AS code, b.nome AS name, b.especialidade AS expertise, b.telem1 AS mobile, b.mail AS email, b.cp AS zipcode
FROM table_name_b b
WHERE b.nome != ''
AND b.cod!='5555555'
AND b.cod!='705416'
AND b.cod NOT IN(SELECT assoc.codigo from table_name_a assoc) 

ORDER BY code ASC

字段类型:

SELECT
a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode
FROM table_name_a a
WHERE a.nome != ''
AND a.codigo!='5555555'
AND a.codigo!='705416'


UNION ALL

SELECT
b.cod AS code, b.nome AS name, b.especialidade AS expertise, b.telem1 AS mobile, b.mail AS email, b.cp AS zipcode
FROM table_name_b b
WHERE b.nome != ''
AND b.cod!='5555555'
AND b.cod!='705416'
AND b.cod NOT IN(SELECT assoc.codigo from table_name_a assoc) 

ORDER BY code ASC
cod,codigo->int(11)

nome,telemovel1,telem1,特别是Dade,codigopostal,cp->varchar(200)

电子邮件->varchar(400)

解释查询:

SELECT
a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode
FROM table_name_a a
WHERE a.nome != ''
AND a.codigo!='5555555'
AND a.codigo!='705416'


UNION ALL

SELECT
b.cod AS code, b.nome AS name, b.especialidade AS expertise, b.telem1 AS mobile, b.mail AS email, b.cp AS zipcode
FROM table_name_b b
WHERE b.nome != ''
AND b.cod!='5555555'
AND b.cod!='705416'
AND b.cod NOT IN(SELECT assoc.codigo from table_name_a assoc) 

ORDER BY code ASC


我建议您重写以下内容:

AND b.cod NOT IN (SELECT assoc.codigo from table_name_a assoc) 
为此:

AND NOT EXISTS (SELECT * FROM table_name_a assoc WHERE assoc.codigo = b.cod)

重写的查询应该使用更少的内存,为并发进程保留更多的内存。

我建议您重写以下内容:

AND b.cod NOT IN (SELECT assoc.codigo from table_name_a assoc) 
为此:

AND NOT EXISTS (SELECT * FROM table_name_a assoc WHERE assoc.codigo = b.cod)

重写的查询应该使用更少的内存,为并发进程保留更多的内存。

要尝试找到如何选择查询,您应该获得查询计划。这将确定使用了哪些索引以及如何改进它。请参阅MySql中的
EXPLAIN
关键字


有了这些信息,您可以确保拥有正确的索引。你也可以考虑临时表。

试图找到如何查询查询,你应该得到查询计划。这将确定使用了哪些索引以及如何改进它。请参阅MySql中的
EXPLAIN
关键字


有了这些信息,您可以确保拥有正确的索引。也可以考虑临时表。

不测试它,我认为问题是在不在子句中。发布关于查询性能的问题,而不提供列类型和可用索引的详细信息,这表明您不了解代码实际在做什么-因此这可能是查询/架构性能问题。我在NOT IN中也有大量的加载时间,因此建议重写。@dor:我已经更新了问题,以包含您所请求的内容(老实说,我没有时间构建适当的问题,对此表示抱歉!)您是否对查询进行了解释以了解问题所在?如果不进行测试,我想问题出在NOT in子句中。发布了一个关于查询性能的问题,但没有给出列类型和可用索引的详细信息,这表明您不了解代码实际在做什么-因此这可能是查询/架构性能问题。我在NOT IN中也有大量的加载时间,因此建议重写。@dor:我已经更新了问题,以包含您所请求的内容(老实说,我没有时间构建适当的问题,对此表示抱歉!)您是否对查询进行了解释以了解问题所在?@Zuul能否显示您的查询和我的查询的解释输出?@Zuul但您说我的产品比您的原始解决方案慢:)@Zuul能否显示您的查询和我的查询的解释输出?@Zuul但您说我的产品比您的原始解决方案慢:)