首页 / MYSQL / 我怎样才能优化这个MySQL查询?
我怎样才能优化这个MySQL查询?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了我怎样才能优化这个MySQL查询?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1869字,纯文字阅读大概需要3分钟。
内容图文
![我怎样才能优化这个MySQL查询?](/upload/InfoBanner/zyjiaocheng/907/ae5c819019124838bec4ab29eda86dd7.jpg)
我有一个存储pupil_id,类别和生效日期(以及其他内容)的表.日期可以是过去,现在或将来.我需要一个查询,从表中提取学生的当前状态.
以下查询有效:
SELECT *
FROM pupil_status
WHERE (status_pupil_id, status_date) IN (
SELECT status_pupil_id, MAX(status_date)
FROM pupil_status
WHERE status_date < NOW() -- to ensure we ignore the "future status"
GROUP BY status_pupil_id );
在MySQL中,表定义如下:
CREATE TABLE IF NOT EXISTS `pupil_status` (
`status_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`status_pupil_id` int(10) unsigned NOT NULL, -- a foreign key
`status_category_id` int(10) unsigned NOT NULL, -- a foreign key
`status_date` datetime NOT NULL, -- effective date/time of status change
`status_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status_staff_id` int(10) unsigned NOT NULL, -- a foreign key
`status_notes` text NOT NULL, -- notes detailing the reason for status change
PRIMARY KEY (`status_id`),
KEY `status_pupil_id` (`status_pupil_id`,`status_category_id`),
KEY `status_pupil_id_2` (`status_pupil_id`,`status_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1409 ;
但是,表中有950名学生和超过1400种状态,查询需要0.185秒才能处理.也许现在可以接受,但是当桌子膨胀时,我担心可扩展性.生产系统可能有超过10000名学生,每个学生将拥有15-20个状态.
有没有更好的方法来编写此查询?我应该有更好的索引来帮助查询吗?请告诉我.
解决方法:
您可以尝试以下方法
1使用INNER JOIN而不是WHERE
SELECT *
FROM pupil_status ps
INNER JOIN
(SELECT status_pupil_id, MAX(status_date)
FROM pupil_status
WHERE status_date < NOW()
GROUP BY status_pupil_id) X
ON ps.status_pupil_id = x.status_pupil_id
AND ps.status_date = x.status_date
2有一个变量并存储NOW()的值 – 我不确定数据库引擎是否将此调用优化为NOW()只是一次调用,但如果它没有,那么这可能会有所帮助
这些是一些建议,但是您需要比较查询计划,看看是否有任何明显的改进.
根据您根据查询计划使用的索引,robob的上述建议也可以派上用场
内容总结
以上是互联网集市为您收集整理的我怎样才能优化这个MySQL查询?全部内容,希望文章能够帮你解决我怎样才能优化这个MySQL查询?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。