我最近通过godaddy转移到使用Plex CPanel的专用Windows主机。 我已经设置了我的站点和数据库(MySQL)
我现在最近注意到我的数据库查询现在花费的时间比预期的要长很多。
我的桌子:
以下是一个例子:
SELECT a.snapshot_id, a.brand_id, b.brand_id
FROM snapshots a
INNER JOIN brands b
ON a.brand_id = b.brand_id
WHERE DATE(a.date_sent) = '2014/11/10'
使用PhpMyAdmin,运行此查询:
显示行0 - 247(总计248,查询耗时30.1080秒。)
这是在网站主页上执行的很长时间。
有关如何优化此功能的任何建议吗?或者服务器真的很慢?
快照表有超过45K行。
EXPLAIN输出:
疯狂的发现! 在比较同一数据库和表的共享主机和专用主机之间的ROWS和SIZE时。
共享:1,023,459条记录@ 1.8GiB 专用:43,416条记录@ 4.5GiB
为什么会出现差异?
答案 0 :(得分:1)
您正在将函数date()
应用于每一行,这非常昂贵。
相反,请以不需要任何转换功能的方式进行比较,如下所示:
WHERE a.date_sent between '2014/11/10 00:00:00' and '2014/11/10 23:59:59'
并确保在该列上定义了索引,并确保已连接表的外键列。
答案 1 :(得分:1)
全部感谢...似乎性能问题不是查询...我已根据上述建议优化了查询,并且没有看到太多改进。
我已经转移到另一个托管服务,并注意到一个巨大的进步。
答案 2 :(得分:0)
您的查询的问题在于,由于DATE()函数是查询where部分的一部分,因此数据库优化器很难应用其优化策略(例如索引)。但是,如果查询重复完全不变,那么一个好的数据库引擎可能会提供加速。
除了将日期和时间分别保存到不同数据库列的一般设计建议(这可能是更好的方法),在这个答案中提出了一个想法https://stackoverflow.com/a/95256/3911010如何避免低效使用查询中的日期。
答案 3 :(得分:0)
一些事情
让你的桌子匹配。一个使用大的int。另一个是int。使用相同的
第二步删除日期功能并与yyyy-mm-dd进行比较
索引快照。 Brand_I'd专栏帮助加入