【问题标题】:Improving PHP MYSQL Query Performance or Server Problem?提高 PHP MYSQL 查询性能或服务器问题?
【发布时间】:2011-08-20 21:33:36
【问题描述】:

我有这个问题:

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 行(并且还在增长)

问题:

当服务器被一两个用户对数据库进行多次查询时,该查询运行良好......但是当服务器被使用时,假设白天有 10 个用户进行多次查询,大约 + /- 1000 个客户端在任何给定时间执行一些查询,查询来自:

显示第 0 - 29 行(总共 7,138 行,查询耗时 0.0734 秒)

显示第 0 - 29 行(总共 7,138 行,查询耗时 100.0933 秒)

提问:

这是查询性能问题还是服务器配置/性能问题?

已编辑:


字段类型:

cod, codigo -> int(11)

nome, telemovel1, telem1, especialidade, codigopostal, cp -> varchar(200)

电子邮件 -> varchar(400)

解释查询:


【问题讨论】:

  • 未经测试,我想问题出在 NOT IN 子句中。
  • 发布一个关于查询性能的问题而没有提供有关列类型和可用索引的详细信息,表明您不了解您的代码实际在做什么 - 因此它可能是查询/模式性能问题。跨度>
  • NOT IN 的加载时间也很长,因此建议重写。
  • @dor:我已经更新了问题以包含您所要求的内容(老实说,没有时间提出适当的问题,对此感到抱歉!)
  • 您是否对查询进行了解释以查看问题所在?

标签: php mysql performance


【解决方案1】:

我提议你重写这个:

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)

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

【讨论】:

  • @Zuul 你能显示你的查询和我的查询的解释输出吗?
  • @Zuul 但是你说我的产品比你原来的解决方案慢:)
【解决方案2】:

要尝试查找如何优化查询,您应该获取查询计划。这将确定使用了哪些索引以及如何改进它。查看 MySql 中的EXPLAIN 关键字。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2011-07-02
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多