gpt4 book ai didi

mysql - 选择两个表花费的时间太长

转载 作者:行者123 更新时间:2023-11-29 08:15:35 26 4
gpt4 key购买 nike

我尝试连接来自 2 个不同表的两个查询并将它们连接到一个选择中,但需要很长时间:

SELECT
p.pid, p.cid, p.date,p.headline,p.content,p.description,
r.reg_id,r.cid,r.year,r.headline,r.description,r.url,r.extra
FROM printers p, readers r
WHERE
(p.headline LIKE '%val%' OR p.content LIKE '%val%' OR p.description LIKE '%val%' OR r.headline LIKE '%val%' OR r.description LIKE '%val%')
AND (p.cid != 37 OR p.cid != 38 OR p.cid != 63 OR p.cid != 64)
AND (p.status = 'online' OR p.status = 'active' OR r.status = 'online' OR r.status = 'active')
AND r.headline_en = ''

花了这么长时间, phpMyAdmin (我正在用它来尝试这个查询)评论说 C:\Windows\Temp\*.myi 上有错误。如果我使用 mysql 客户端,它会评论说我应该提高内存限制。表 printers 有 <2000 行,而表 readers 有不到 1000 行,这不是一个大数据库......我更喜欢优化,因为我无权访问我的主机中的 mysql 配置。

请帮助我,我的查询是否错误,或者我必须更改我的 my.cnf ??

编辑:如果缺少信息。此查询针对网站上的“搜索”功能,因此没有限制,并且它们是两个不同的表,没有共享列。

最佳答案

您正在搜索两个表,但没有以任何方式将它们关联起来。这会创建

  • 对于打印机中的每个匹配行,读取器的所有匹配行
  • 对于读取器中的每个匹配行,打印机中的所有匹配行

因此,与打印机相关的查询部分针对每个匹配的读取器运行,反之亦然。这相当于 2000000 次全表扫描的数量级。

要解决此问题,

  • 关联表(通过 JOIN 子句)
  • 或者将查询分成两部分,可能使用UNION将它们重新组合

编辑

这些是回复评论时的随机想法:

  • 使用 LIKE '%val%' 使索引无法使用
  • 第一个 WHERE 条件对 p 和 r 都是选择性的。据我(可能是错误的)理解,这排除了使用其中一个作为驱动表,真正创建交叉选择表扫描。当然,2000000 是最大最坏情况(所有匹配)
  • 我忘记了什么吗?

关于mysql - 选择两个表花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com