SELECT count(*) c FROM full_view WHERE verified > ( DATE (NOW()) - INTERVAL 30 DAY)
如果我运行该查询,它需要一秒钟,但如果我切换比较运算符,它需要 eons。现在第一种方式count = 0,第二种方式count = 120000,但如果我只计算整个表也需要微秒。
但是有一些奇怪的事情正在发生,因为如果查询确实完成了,它会在之后运行得非常快。MySQL正在缓存查询还是正确的?好吧,我不想依靠缓存来确保网站不会挂起。
这似乎很荒谬:如果它可以快速计算大于某个日期的所有内容,为什么还要花更长的时间来计算相反的时间?无论哪种方式,它都必须查看整个表格,对吗?它只需要返回一个数字,因此带宽不应该成为问题。
解释查询:
1, 'SIMPLE', 'b', 'range', 'updated,verified_index', 'updated', '3', '', 28, 'Using where'`
1, 'SIMPLE', 'l', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'xyz_main.b.loc_id', 1, 'Using index'
1, 'SIMPLE', 'f', 'ALL', '', '', '', '', 2214, ''
编辑:
这可能会引起一些兴趣,我在运行查询时发现了以下信息:
Handler_read_rnd_next:
- 254436689(做不到时)
- 2(大于)
Key_read_requests:314393 vs 33(33是使用大于时所有统计数据的最大数字)
Handler_read_key:104303 vs 1
绕过视图并直接在主表上运行查询消除了缓慢。那么我需要做些什么来加快速度呢?视图基本上是这样的:
SELECT x, y, z, verified FROM table1 LEFT JOIN table2 on tab2_ID = table2.ID LEFT JOIN table3 on tab3_ID = table3.ID
已解决:弗兰基带领我朝着正确的方向前进。第二个连接表(公司表)是通过公司的全文名称连接的。我最近才决定向该表添加一个整数键。name 列应该被索引,但我可能搞砸了。无论如何,我重新组织了一切。我将主表中的外键转换为匹配公司表的整数 ID 而不是完整的公司名称。我重新索引了每个表中的这些列,然后我更新了视图以反映新的连接点。现在它立即在两个方向上运行。:) 所以我猜整数键是关键。问题消失了,但我觉得我最初的问题并没有真正解决。
谢谢你们的帮助。