我尝试从两个不同的表中加入两个查询并将它们连接成一个选择,但这需要太长时间:
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
具有<表readers
行的行数少于1000行,这不是一个大数据库...我更喜欢优化,因为我无法访问主机中的mysql配置。
请帮助我,我的查询错误或者我必须更改my.cnf ??
编辑:如果缺少信息。此查询用于站点上的“搜索”功能,因此没有限制,它们是两个不同的表,没有共享列。
答案 0 :(得分:2)
您正在搜索两个表格,而不以任何方式关联它们。这会创建
因此,与打印机相关的查询部分是针对每个匹配的阅读器运行的,反之亦然。这使其处于2000000个全表扫描的数量级。
要解决此问题,
JOIN
子句)UNION
修改强>
这些是回复评论的随机想法:
LIKE '%val%'
无法使用索引WHERE
条件对p和r都有选择性。这是我(可能是错误的)理解,这排除了使用其中一个作为驱动表,真正创建了一个交叉选择表扫描。当然2000000是最严重的情况(所有比赛)答案 1 :(得分:0)
好的,首先我提出了你的查询
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 (
CONCAT(
p.headline,
p.content,
p.description,
r.headline,
r.description
)
LIKE '%val%' )
AND p.cid NOT IN (37,38,63,64)
AND (p.status IN ('online','active')
OR r.status IN ('online','active')
AND r.headline_en = ''
你也可以在任何列上放置索引,那些你要搜索的列应该尝试索引
编辑。你还需要对你的数据进行连接,否则你最终会得到大量的组合,所以上面只是在'WHERE'之后的位上优化了