[英]mysql Query very slow, any recommendation on how to optimize?
我最近已经通过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秒。)
在网站首页上执行该操作已经很长时间了。
关于如何优化这一点的任何建议? 还是服务器真的很慢?
快照表有超过45,000行。
EXPLAIN输出:
疯狂的发现! 在共享主机和同一数据库和表的专用主机之间比较ROWS和SIZE时。
共享:1,023,459条记录@ 1.8GiB专用:43,916条记录@ 4.5GiB
为什么会有差异?
您将函数date()
应用于每一行,这非常昂贵。
而是,以不需要任何转换功能的方式进行比较,如下所示:
WHERE a.date_sent between '2014/11/10 00:00:00' and '2014/11/10 23:59:59'
并确保在该列和联接表的外键列上定义了一个索引。
谢谢...似乎性能问题不是查询...我已根据上述建议对查询进行了优化,但未见太大改进。
从那以后,我搬到了另一个托管服务处,并注意到了巨大的进步。
查询的问题在于,由于DATE()函数是查询的where部分的一部分,因此数据库优化器很难应用其优化策略(例如索引)。 但是,如果重复完全不重复查询,则良好的数据库引擎可能能够提高速度。
除了将日期和时间分别保存到不同数据库列中的一般设计建议(这可能是更好的处理方式)之外,此答案中还提供了一个想法https://stackoverflow.com/a/95256/3911010如何避免查询中DATE的低效使用。
一些东西
使您的表匹配。 一个使用一个大整数。 另一个int。 使用相同
第二个删除日期函数并与yyyy-mm-dd比较
索引快照。 Brand_I'd专栏可以帮助加入
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.