选择两个表需要太长时间

时间:2013-12-19 00:35:50

标签: mysql sql

我尝试从两个不同的表中加入两个查询并将它们连接成一个选择,但这需要太长时间:

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 ??

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

2 个答案:

答案 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'之后的位上优化了